手動ガベージ コレクション

関数 gc() はガベージ コレクターを呼び出します。

通常、利用可能なメモリが欠乏すると、コレクタが自動的に動作するため、それを明示的に呼び出す必要はありません。

ただし、場合によっては、ガベージ コレクションによる中断をできるだけ遅らせるように、強制的にコレクションを行えるときに役立ちます。

   

また、コレクターを呼び出して参照されないオープン ファイルを閉じることができます。

ファイルがまだ開いている間にランタイム エラーが生じた場合、ファイルを開いたままにすることもできます。

この時点でファイル オブジェクトがローカル変数に保持されている場合、リスナーからそれを取得して強制終了をしてから開こうとすると、オペレーティング システムから「既に開いている」というエラーが返される可能性があります。

オペレーティング システムから「既に開いている」というエラーが返される可能性があります。

コレクターが動作すると、ファイル オブジェクトが取り戻され、それに関連付けられているオープン ファイルが強制的に終了されます。

   

gc [light:false] [delayed:false] 	 

この関数はコレクション後に MAXScript ヒープ内の使用可能なバイト数を返します。

取り戻された複数の小さいオブジェクトでヒープがいっぱいになっている場合、コレクターが動作するのに数秒かかります。

 

ガベージ コレクションの light: オプション

オプションの light: キーワード引数が true として渡されると、元に戻すバッファはフラッシュされません。

多数のシーン操作を実行する場合は、引数を指定しないで gc() を呼び出すか light:false を渡すことをお勧めします。この場合、元に戻すバッファはガベージ コレクションの前にフラッシュされます。

light:true を指定すると、MAXWrapper から派生した値は収集されません。

これは、アンドゥ バッファに保管される値タイプすべてに当てはまります。

この場合、メモリは少ししか解放されず、 gc の実行速度が低下しますが、やり直しスタックを壊すことはありません。

light:true が指定されていない場合、動作と速度は前の状態と同じです。

light:true で収集されるのは、ロールアウト、フロータ、UI 項目、ビットマップ、文字列、配列、および bitArray です。

つまり、シーンに存在しないすべての項目です。

 

自動ガベージ コレクションと delayed: option

MAXScript でヒープ メモリが不足した場合、ガベージ コレクションを実行して未使用のメモリを解放します。

収集された値は MAX オブジェクトに対する直前の参照であるかもしれないので、アンドゥ システムをフラッシュする必要があります。ここにはそのオブジェクトまたはその従属に対するポインタが含まれている可能性があるからです。

3ds Max 5 では、手動ガベージ コレクションに対して「ライト」キーワード引数が導入されました。ここでは true の場合には MAXWrapper から派生した値のガベージ コレクションは実行されないので、MAX オブジェクトが削除されることはなく、アンドゥ システムをフラッシュする必要はありません。

3ds Max 6 における MAXScript への変更では、この機能が拡張されて自動ガベージ コレクションが実行されるようになりました。

自動ガベージ コレクションが実行され、アンドゥ システムが空でない場合、最初のガベージ コレクションは MAXWrapper のガベージ コレクションが行われていないところで実行され、次のアンドゥ システムのフラッシュで完全なガベージ コレクションが実行されるようにフラグが設定されます。

この最初のガベージ コレクションでは要求に対して十分なメモリが解放されない場合、または、アンドゥ システムが空である場合は、MAXWrapper が削除されてアンドゥ システムがフラッシュされた場所でフル ガベージ コレクションが実行されます。

MAXWrapper のインターンの最近の改良により、MAXScript のガベージ コレクションによるアンドゥ システムのフラッシュはきわめて稀なイベントになりました。

現在の動作を維持するために、「gc()」を使用した手動ガベージ コレクションでも引き続きアンドゥ システムがフラッシュされます。 gc light:true は、引き続きアンドゥ システムをフラッシュしません。

delayed:<boolean> オプションによって、次のアンドゥ システムのフラッシュではフル ガベージ コレクションが発生します。

したがって、次のスクリプトは自動ガベージ コレクションの動作と一致すると言えます。

gc light:true delayed:true

関連事項