可能であれば計算の実行は 1 回だけにする
 
 
 

MAXScript に関する質問と回答 > 処理速度を上げる方法 > 可能であれば計算の実行は 1 回だけにする

MAXScript ではコードが最適化されません。自分で最適化する必要があります。

同じ計算を複数回実行したり、同じノードの同じ値を複数回参照したりしなでください。

テスト ケース:

fn test4a inVal =
(
local res = 0
for i = 1 to 100 do res += ((inVal * 10) + i)
res
)
-- 黒と赤のグラデーションを表示します。
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 ミリ秒
test4b 0   -- 17797 ミリ秒

できるだけ高速に処理したいスクリプトの典型的な例としてはパーティクル フローの Script オペレータもあります。通常の 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 万回評価されることになってしまいます。

前のヒント

ライン全体を取得できる場合は単一ピクセルを取得しない

次のヒント

頻繁に使用する関数とオブジェクトをキャッシュする