テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】指定のコードがGCを発生させるかどうかをテストする(AllocatingGCMemory)

GCガベージコレクション)はコードに紛れひっそりと忍び込みます。
今回はソレを見つけるのに便利なAPIが追加されていたので試してみました。

AllocatingGCMemoryでGCの発生を監視する

Unity 2018.3からAllocatingGCMemoryが新しく追加されました。
このコードとAssert.Thatを使用すると、実装の中でGCが発生しているかどうかをテストすることが出来ます。

Unity - Scripting API: AllocatingGCMemoryConstraint

例えば下のコードはマニュアルのコードです。int aを定義し代入する処理がGCを発生するかといった点をテストしています。 f:id:tsubaki_t1:20181002184258j:plain

ここで少し注意したいのが、IsNUnit.Framework.IsではなくUnityEngine.TestTools.Constraints.Isという点です。
何がどう違うのかは確認していませんが、サンプルコードではご丁寧にusing Is = UnityEngine.TestTools.Constraints.Is;でラッピングしてありました。

実際に使ってみる

実際に使ってみます。
当然テストコードなので、ユニットテストにて処理を実装…という感じのことをしています。一応Runtimeに属するAssertなのでDevelopmentBuildで動くんじゃないかな

コードは下のような感じです。

gist.github.com

結果は下のような感じです。
まぁ普通に配列を宣言したりLINQを使用すればGCが発生しますが、普通に足したりキャストしたりする程度ではGCが発生しません。 f:id:tsubaki_t1:20181002185207j:plain

そういえば昔は構造体や変数をキャストしたりボクシングしたりするとゴミが出てたような記憶があるんですが、今確認すると特に出ないですね。はて?

関連

GCを発生させない」というAPIも追加されました。流石に長時間放置するとゲームが死にますが、「アクションが激しくて絶対に止めたくない」という場合に有効かもしれません。

baba-s.hatenablog.com