はじめに
Unity 2018.3 からガベージコレクションを無効化できる API が追加されました
使い方
UnityEngine.Scripting 名前空間に存在する GarbageCollector クラスを使用します
using UnityEngine.Scripting; ... // ガベージコレクションを有効化 GarbageCollector.GCMode = GarbageCollector.Mode.Enabled; // ガベージコレクションを無効化 GarbageCollector.GCMode = GarbageCollector.Mode.Disabled; // モードが変更された時に呼び出される GarbageCollector.GCModeChanged += mode => Debug.Log( mode );
上記のように使用できます
使用例
スペースキーが押されたら
ガベージコレクションの有効・無効を切り替えるスクリプトを作成して試してみました
ガベージコレクションが有効になっている時に GC.CollectionCount( 0 ) を参照すると
ガベージコレクションが動作していることがわかります
ガベージコレクションを無効化した状態で GC.CollectionCount( 0 ) を参照すると
毎フレーム 3.1 MB の GC Alloc が発生していても、
ガベージコレクションが停止していることがわかります
用途
例えば、メニュー画面ではガベージコレクションを有効にしておき、
ゲーム画面に遷移する時にガベージコレクションを無効化することで、
ゲーム中にガベージコレクションが走って
ゲームがカクついてしまう現象を防ぐことができるかなと思います
注意
Unity 2018.3 がベータ版だった頃に
ガベージコレクションを無効化した状態で頻繁に大量の GC Alloc を発生させていたら
エラーが発生して
ゲームが強制終了しました
正式にリリースされた Unity2018.3 では徐々に Unity の動きが重くなって
しばらくするとフリーズして操作を受け付けなくなりました
環境によって挙動が違う可能性はありますが、扱いには注意が必要です