コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity 2018.3 新機能 ガベージコレクションを無効化できる API が追加された

はじめに

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 );

上記のように使用できます

使用例

スペースキーが押されたら
ガベージコレクションの有効・無効を切り替えるスクリプトを作成して試してみました

f:id:baba_s:20181214102934g:plain

ガベージコレクションが有効になっている時に GC.CollectionCount( 0 ) を参照すると
ガベージコレクションが動作していることがわかります

f:id:baba_s:20181214103001g:plain

ガベージコレクションを無効化した状態で GC.CollectionCount( 0 ) を参照すると
毎フレーム 3.1 MB の GC Alloc が発生していても、
ガベージコレクションが停止していることがわかります

用途

例えば、メニュー画面ではガベージコレクションを有効にしておき、
ゲーム画面に遷移する時にガベージコレクションを無効化することで、
ゲーム中にガベージコレクションが走って
ゲームがカクついてしまう現象を防ぐことができるかなと思います

注意

Unity 2018.3 がベータ版だった頃に
ガベージコレクションを無効化した状態で頻繁に大量の GC Alloc を発生させていたら

f:id:baba_s:20180928210029p:plain

エラーが発生して

f:id:baba_s:20180928210038p:plain

ゲームが強制終了しました

正式にリリースされた Unity2018.3 では徐々に Unity の動きが重くなって
しばらくするとフリーズして操作を受け付けなくなりました

環境によって挙動が違う可能性はありますが、扱いには注意が必要です