ざきのメモ

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 は、メモリリークにつながる恐れがある。

Copyright © 2017-2021 Ryo Okazaki, all rights reserved.