« さよならロール。 | トップページ | 無限LensShader解消。しかし。 »

2010年6月11日 (金)

AddCamera と SIGetPrimCamera の対決。

うーむ、カメラなんですがね。


カメラに関係するスクリプトを書いていて、カメラを取り出すのに、当然のように X3DObject.AddCamera メソッドを使ったわけなんですが。


なんかね、動作がもっさりしているんですよ。遅いの。数秒待たされるような感じ。


こういうもんなのかなあ、と思っていたんですがね。
でも考えてみれば、普通にインターフェース上から Get > Primitive > Camera ってやれば、カメラなんて一瞬で出てくるじゃないですか。おかしいなあと思ってね。 そこでインターフェース上から操作したときにログされる GetPrimCamera コマンドをペーストして実行させてみたら、一瞬で終わりやがるんですね。


一般的には、オブジェクトモデルで書いた方が実行速度が速い。はず。
でも今回の場合、コマンドモデルで書いた方が速いという結果になっている。
しかも、1000回ループさせてようやく体感できる程度の速度差が出たとかではなく、たった1個のカメラを取得するだけであからさまな差が出ている。


試しにに計測してみました。
Addcamera_vs_sigetprimcamera
AddCamera メソッド 2.453秒
SIGetPrimCamera コマンド 0.047秒

こんなに差があるっ ( Д) ゚ ゚


カメラを取り出す以外のことも少し書かれていますが、速度への影響は完全に無視できる程度です。基本的に、両方ともカメラとインタレストをオブジェクトとして取得して名前を確定するという、処理の結果得られるものが同じになる条件にしているだけです。ちなみに上の画面は XSI 2011 ですが、XSI 7.01 で試しても結果は同じでした。


つうことで、理由はわからねど、カメラ取り出す時はコマンド使った方が速そうだということになりますた。今後そうしよう。


ちなみにオブジェクトモデルの AddCamera メソッドは戻り値がカメラそのものなので、

     var oCam = xxx.AddCamera("Camera","MyCamera")

などとやれば oCam にカメラがオブジェクトとして取得できますが、 SIGetPrimCamera コマンドは JScript で書く場合、そのまんまカメラを取得できません。JScript では Output Argument が使えないから? なんですよね? VBS では問題ないはず。 Output Argument って日本語ではなんて言うんだろう? 出力引数?  ま、ともかく、上の画面のように

    rtn = SIGetPrimCamera( "Camera", "CM_Cam", "CM_Int",ActiveSceneRoot );
    var oCam2 = rtn.Value("3DObjCamera" );
    var oInt2 = rtn.Value("3DObjCameraInterest" );


こんな風に書かないとカメラをオブジェクトとして取得できません。めんどくさい気もしますが、まあ、こういう風にやればよいと覚えてしまえばいいやと思っています。

これは ISIVTCollection っていうんですね? ISIVT ってなんやねん。 マニュアルには 「コマンドが Output Argument を持っているんだけど戻り値を明確に指定してない場合は、実は ISIVTCollection という特別なコレクションを返しています」 という意味のことが書かれてますが、意味判りません。

判らなくてももなんとかなってるからまあいいけど、いつもこうしてスルーしているから根本的な部分での理解が進まず、下手な鉄砲を数撃ちながら当てるという、まさに場当たり的なスクリプターになっていくのであります。Orz





.

|

« さよならロール。 | トップページ | 無限LensShader解消。しかし。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: AddCamera と SIGetPrimCamera の対決。:

« さよならロール。 | トップページ | 無限LensShader解消。しかし。 »