可能な場合は[元に戻す]を使用不可にする
 
 
 

MAXScript に関する質問と回答 > 処理速度を上げる方法 > 可能な場合は[元に戻す]を使用不可にする

[元に戻す]機能によって多くのメモリが消費され、処理が遅くなることがあります。

テスト ケース:

em = mesh()
meshop_setvert = meshop.setvert
fn test7 holdAll =
(
 local nVerts = getnumverts em
 for i = 1 to nVerts do
  with undo (holdAll or (i == 1 or i == nVerts))
   meshop_setvert em i ([1,1,1]*i)
)

100,000 回の繰り返しの場合

test7 true -- 85313 ミリ秒., 229 MB
test7 false-- 7609 ミリ秒., 11 MB

undo レコードを作成するすべての操作は、変更されたオブジェクトの内部コピーを作成して後で元に戻せるようにするため、時間とメモリを消費します。複数オブジェクトをまとめてアタッチするなど、ループ内で複数の変更を加える場合、[元に戻す]機能では生成されるオブジェクトごとに 1 つの undo コピーを作成しようとするためメモリが不足する可能性があります。Undo off () コンテキストを使用して明示的に[元に戻す]機能を無効にすると、このような場合にスクリプトの速度を大幅に向上する手助けとなります。

undo

次の例でこの違いを示します。どちらの場合も、MAXScript を使用して 1000 個のボックスを作成してから attach 関数を使用して 1 つのメッシュにアタッチします。最初の例では、既定値によって attach 呼び出しごとに 1 つの undo レコードが生成されます。2 番目の例では、[元に戻す]機能は明示的に使用不可にされます。

例 1 - 最適化されていないスクリプト:

delete $Box*--すべての既存ボックスを削除します。
box_array = #()--配列を初期化します
for i = 1 to 1000 do--1000 回繰り返します
  box_array[i] = box pos:[i*30,0,0]--ボックスを 1000 個作成します。
st = timestamp()---- 開始時間をティックで取得します。
master_box = convertToMesh box_array[1]--最初のボックスをメッシュに集約
for i = 2 to 1000 do--他のすべてのボックスを巡回します。
  attach master_box box_array[i]--各ボックスをメッシュにアタッチします。
et = timestamp()--時間を停止します。
print (et-st)--結果時間を印刷します。
gc()---- ガーべジ コレクションを呼び出します。

800MHz の PC では、スクリプトのアタッチ部分の実行に 1 分以上かかりました。これは主に、システムのメモリが不足して OS がディスクにスワップする必要があったためです。3ds Maxのメモリ使用量は約 300 MB に達しました。

例 2 - 最適化されているスクリプト:

delete $Box*
box_array = #()
for i = 1 to 1000 do
box_array[i] = box pos:[i*30,0,0]
st = timestamp()
undo off--the only difference - 唯一の違いです。
(-- undo はオフになっています。
  master_box = convertToMesh box_array[1]
for i = 2 to 1000 do
  attach master_box box_array[i]
)--undo off 終了
et = timestamp()
print (et-st)
-- ガーべジ コレクションを呼び出します。これは後で必要になります。

同じ 800MHz のマシンでスクリプトのアタッチ部分の実行に 3685 ミリ秒しか、かかりませんでした。約 20 倍も速度が向上しています。Windows の[タスク マネージャ]ではメモリ消費量の変化はありませんでした。

前のヒント

シーン オブジェクトに変更を加えるときに、[ビューポートの再描画]を使用不可にする

次のヒント

[修正]パネルの速度が低下する可能性 - 可能な場合は[作成]パネルに変更する