コガネブログ

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

【Unity】Unity 2018.3.0b3 からガベージコレクションを無効化できる API が追加されたので試してみた

はじめに

Scripting: Added UnityEngine.Scripting.GarbageCollector API for enabling and disabling the garbage collector on Mono and IL2CPP scripting backends.

Unity 2018.3.0b3 からガベージコレクションを無効化できる 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:20180928205258g:plain

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

f:id:baba_s:20180928205309g:plain

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

用途

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

注意

ガベージコレクションを無効化した状態で頻繁に大量の GC Alloc を発生させていると、

f:id:baba_s:20180928210029p:plain

エラーが発生して

f:id:baba_s:20180928210038p:plain

ゲームが強制終了するので注意が必要です