人気ブログランキング | 話題のタグを見る

管理人syogeki            主にCG日記。


by g-sp
カレンダー
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

スクリプトの処理時間

スクリプトを1個追加しました。
で、今回初めて気づいたことが。
今回のは選択ポリゴンごとに一個ずつループで回して法線とカメラとの角度を計算して判定して・・・というものなんですが、一番初めにやっていたやり方は、角度を判定して設定された値よりも小さかったら 「それを選択する」 ということをループでやっていました。
で、縦50横50のポリゴン球に適用してみたところ・・・やたら時間かかる。
高々2500ポリゴンでこの速度じゃ使い物にならないな・・・と思いました。

文の書き方によっても処理の速度は変わってくると思いますが、一番影響があったのが、さっきの「選択する」という動作です。




一個目のときは SelectGeometryComponents で2個目以降は AddToSelection のコマンドを使って選択していたわけですが、何回もループで回すところにXSIの動作を入れると、そのループ回数が多いとものすごい時間が掛かってしまいます。
ログメッセージを流す logmessage というコマンドもスクリプトを書いているときは役に立ちますが、最終的に必要ない場合は残さない方がいいと思います。

こういう場合どうするかと言うと、コレクションを使います。
Set oColl = CreateObject( "XSI.Collection" ) という感じでまず宣言します
そして、oColl.Add "オブジェクトの名前" といやればそのオブジェクトがコレクションリストに入ります。
先に名前だけ記憶しておくわけですね。
で、一つのコレクションに複数記憶できるので、ループで回す所でXSIでオブジェクトに何かする代わりに oColl.Add をつかって名前を記憶しておきます。
ループが終わったところで、そのコレクションにXSIの動作を適用します。
今回の場合は SelectGeometryComponents oColl となります。

こうやって書き換えるだけで速度が段違いになります。
ちなみに、普通こんなことをやる人は居ないと思いますが、ループの中に SelectGeometryComponents oColl を入れて実験してみました。
どうなるかというと、ループが回るたびに選択ポリゴンを更新するわけです。
・・・おそっ!!
2500ポリゴンで5分以上かかったと思います・・・10分は経ってないと思う。
最終的な結果はどれも同じなんですがね。
ループで選択更新>>>・・・・・・・>>>ループで選択追加>>>>>>名前だけ記憶して後でまとめて実行
という感じの結果になりました。
ループの回数が増えれば増えるほどこの差は広がっていきます。
まとめると、仕様的にどうしても無理な場合はしょうがないですが、ループで何かXSIの動作をいれるならコレクション使うのがおすすめです。

この前作った歪んだポリゴン検出のスクリプトは、ひどいもので、各ポリゴンでのループの中で調べた頂点の角度を延々とログに流すように作って、さらにそこにカウントなんか入れてみたりしてたし、そもそもループの中で選択してたので結構時間かかるスクリプトでしたね。
ちょっとその辺書き直して、速度重視にしてからスクリプト置き場へもって行きますね。
by g-sp | 2006-07-13 14:46 | XSI