可能であれば計算の実行は 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.
|
できるだけ高速に処理したいスクリプトの典型的な例としてはパーティクル フローのスクリプト オペレータもあります。通常のスクリプト オペレータでは、現在のイベントのパーティクル
コンテナ内のすべてのパーティクルを巡回し、それぞれに対して何らかの処理を行います。
典型的な 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 万回評価されることになってしまいます。
前のヒント
ライン全体を取得できる場合は単一ピクセルを取得しない
次のヒント
頻繁に使用する関数とオブジェクトをキャッシュする