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

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.

できるだけ高速に処理したいスクリプトの典型的な例としてはパーティクル フローのスクリプト オペレータもあります。通常のスクリプト オペレータでは、現在のイベントのパーティクル コンテナ内のすべてのパーティクルを巡回し、それぞれに対して何らかの処理を行います。

典型的な 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 万回評価されることになってしまいます。

前のヒント

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

次のヒント

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