2020/3/4
Unity の Sprite はメモリリークする
Unity で Sprite を使用していてメモリリークしたのでメモを残しておきます。
使用環境
Unity 2019.2.13f1
メモリリークの症状
Unity の Profiler のメモリ欄で以下のような症状が起きていました。
- Total Objects の値が時間ともに増加。
- Textures, Meshes, Materials などの値は変化せず。
原因
繰り返し、Sprite を Create していたことが原因でした。
私の場合は、以下のような Texture2D を Sprite に変換している処理を Monobehaviour::Update() に記述していたことでメモリリークを起こしていました。
Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f, 0.5f));
this.transform.GetChild(0).GetComponent().sprite = sprite;
解決方法
不要な Sprite の Create を避けることで、メモリリークは回避できます。
私の場合は、上記の処理を一回のみの実行にする (Monobehaviour::Start() 内などに移動する) ことでメモリリークを回避しました。
また動的に複数 Sprite を生成する場合は、不要になったタイミングで以下のように Destroy することでメモリリークを回避できます。
Destroy(sprite);
まとめ
不要な Sprite の Create は、メモリリークにつながる恐れがある。