仕事で、GameObjectの返却が機能していない! Materialが破棄されていない!
ということがあり、Profilerを見れば一目瞭然でした。
見た目を作る時って、見た目をどうするかの調整ばかりに目が入ってしまい、そうした内部メモリのコントロールを疎かにしがちなんですよね。
プライベートで、Unity Profilerを改めてじっくりみてみることにしました。
改めてみると、なかなかのビジュアルではないですか。
プライベートのアプリを検証してみます、そこで問題だったのは、Scene Objects。Game Objectsは、さほど変動していないのですが、このScene Object Countが万単位になっています。
上記によると。
ダイナミックな UnityEngine.Object の総数です。この数には GameObject Count と、コンポーネントの総数、そしてシーン内でアセットではないものが含まれます。 |なし| |Object Count|アプリケーションが作成またはロードするネイティブのUnityEngine.Object`の総数です。この数には、Scene Object Count と、すべてのアセットの合計数が含まれます。この数値が時間とともに増加する場合、アプリケーションが GameObject やその他のアセットを作成し、それらをまったく破棄したりアンロードしたりしていないということです。
とのこと。
で、どれよ、と。
Detailed - Take Sampleで詳細な参照が取れるようです
心当たりは大体あって、SpriteとTextureでしょう。
記事にあるようにSpriteとTexture2Dの破棄をしてませんでした。
SpriteとTextureの破棄ですが、なかなか破棄するタイミングがなく。キャッシュしていたりするので、なかなか難しいんですよ。これが。
Resources.UnloadUnusedAssetsも変なタイミングで呼ぶと使うはずだったものも削除されたりします。
とはいえ、以下のようなコードを入れることでグングン増えるScene Objectsの抑制にはつながりました。
var oldSprite = Renderer.sprite; if (oldSprite != null) Destroy(oldSprite); Renderer.sprite = sprite;