より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Unity Profiler Memory - Scene Object Count - SpriteとTexture2D

仕事で、GameObjectの返却が機能していない! Materialが破棄されていない!

ということがあり、Profilerを見れば一目瞭然でした。

見た目を作る時って、見た目をどうするかの調整ばかりに目が入ってしまい、そうした内部メモリのコントロールを疎かにしがちなんですよね。

プライベートで、Unity Profilerを改めてじっくりみてみることにしました。

改めてみると、なかなかのビジュアルではないですか。

プライベートのアプリを検証してみます、そこで問題だったのは、Scene Objects。Game Objectsは、さほど変動していないのですが、このScene Object Countが万単位になっています。

docs.unity3d.com

上記によると。

ダイナミックな UnityEngine.Object の総数です。この数には GameObject Count と、コンポーネントの総数、そしてシーン内でアセットではないものが含まれます。 |なし| |Object Count|アプリケーションが作成またはロードするネイティブのUnityEngine.Object`の総数です。この数には、Scene Object Count と、すべてのアセットの合計数が含まれます。この数値が時間とともに増加する場合、アプリケーションが GameObject やその他のアセットを作成し、それらをまったく破棄したりアンロードしたりしていないということです。

とのこと。

で、どれよ、と。

Detailed - Take Sampleで詳細な参照が取れるようです

心当たりは大体あって、SpriteとTextureでしょう。

alien-program.hatenablog.com

zaki0929.github.io

記事にあるようにSpriteとTexture2Dの破棄をしてませんでした。

SpriteとTextureの破棄ですが、なかなか破棄するタイミングがなく。キャッシュしていたりするので、なかなか難しいんですよ。これが。

Resources.UnloadUnusedAssetsも変なタイミングで呼ぶと使うはずだったものも削除されたりします。

alien-program.hatenablog.com

とはいえ、以下のようなコードを入れることでグングン増えるScene Objectsの抑制にはつながりました。

      var oldSprite = Renderer.sprite;
      if (oldSprite != null) Destroy(oldSprite);
      Renderer.sprite = sprite;