【Unity】指定のコードがGCを発生させるかどうかをテストする(AllocatingGCMemory)
GC(ガベージコレクション)はコードに紛れひっそりと忍び込みます。
今回はソレを見つけるのに便利なAPIが追加されていたので試してみました。
AllocatingGCMemoryでGCの発生を監視する
Unity 2018.3からAllocatingGCMemory
が新しく追加されました。
このコードとAssert.That
を使用すると、実装の中でGCが発生しているかどうかをテストすることが出来ます。
Unity - Scripting API: AllocatingGCMemoryConstraint
例えば下のコードはマニュアルのコードです。int a
を定義し代入する処理がGCを発生するかといった点をテストしています。
ここで少し注意したいのが、Is
がNUnit.Framework.Is
ではなくUnityEngine.TestTools.Constraints.Is
という点です。
何がどう違うのかは確認していませんが、サンプルコードではご丁寧にusing Is = UnityEngine.TestTools.Constraints.Is;
でラッピングしてありました。
実際に使ってみる
実際に使ってみます。
当然テストコードなので、ユニットテストにて処理を実装…という感じのことをしています。一応Runtimeに属するAssertなのでDevelopmentBuildで動くんじゃないかな
コードは下のような感じです。
結果は下のような感じです。
まぁ普通に配列を宣言したりLINQを使用すればGCが発生しますが、普通に足したりキャストしたりする程度ではGCが発生しません。
そういえば昔は構造体や変数をキャストしたりボクシングしたりするとゴミが出てたような記憶があるんですが、今確認すると特に出ないですね。はて?
関連
「GCを発生させない」というAPIも追加されました。流石に長時間放置するとゲームが死にますが、「アクションが激しくて絶対に止めたくない」という場合に有効かもしれません。