MAXScript に関する質問と回答 > 処理速度を上げる方法 > 可能であれば計算の実行は 1 回だけにする |
MAXScript ではコードが最適化されません。自分で最適化する必要があります。
同じ計算を複数回実行したり、同じノードの同じ値を複数回参照したりしなでください。
テスト ケース: |
fn test4a inVal = ( local res = 0 for i = 1 to 100 do res += ((inVal * 10) + i) res ) --show the same nice black-red gradient |
fn test4b inVal = ( local res = 0 local temp = inVal * 10 for i = 1 to 100 do res += (temp + i) res ) |
100,000 回の繰り返しの場合 |
test4a 0 -- 20562 msec. test4b 0 -- 17797 msec. |
できるだけ高速に処理したいスクリプトの典型的な例としてはパーティクル フローの Script オペレータもあります。通常のスクリプト オペレータでは、現在のイベントのパーティクル コンテナ内のすべてのパーティクルを巡回し、それぞれに対して何らかの処理を行います。
典型的な Proceed ハンドラは次のようになります。
良いコード |
on Proceed pCont do ( count = pCont.NumParticles() for i in 1 to count do ( pCont.particleIndex = i pCont.particleVector = pCont.ParticlePosition ) ) |
処理するパーティクルの数を含む「count」変数が 1 回だけ評価された後、i ループの上限として使用されていることに注目してください。
これは次のように記述することもできます。
悪いコード |
on Proceed pCont do ( for i in 1 to pCont.NumParticles() do ( pCont.particleIndex = i pCont.particleVector = pCont.ParticlePosition ) ) |
しかし、このように書くことはお勧めできません。パーティクルが 100 万個ある場合、pCont.NumParticles() は 1 回だけではなく、100 万回評価されることになってしまいます。
前のヒント
次のヒント