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

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

テスト ケース:

    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 msec., 229 MB
    test7 false-- 7609 msec., 11 MB

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

undo

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

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

    delete $Box*--delete any existing boxes
    box_array = #()--initialize an array
    for i = 1 to 1000 do--repeat 1000 times
      box_array[i] = box pos:[i*30,0,0]--create 1000 boxes
    st = timestamp()--get the start time in milliseconds
    main_box = convertToMesh box_array[1]--collapse the first box to mesh
    for i = 2 to 1000 do--go through all other boxes
      attach main_box box_array[i]--attach each box to the mesh
    et = timestamp()--stop the time
    print (et-st)--print the resulting time
    gc()--call Garbage Collection &endash; you will needed it!

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 - the undo
    (--has been turned off
      main_box = convertToMesh box_array[1]
    for i = 2 to 1000 do
      attach main_box box_array[i]
    )--end undo off
    et = timestamp()
    print (et-st)
    --call Garbage Collection - you will needed it!

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

前のヒント

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

次のヒント

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