渋谷ほととぎす通信

完全趣味でやってる技術メモ。※所属団体とは一切関係がありません。

Unity RenderTextureのメモリを解放するのはReleaseが良いの?Destroyが良いの?


f:id:esakun:20150730215258g:plain:w450

RenderTextureのメモリ確保と解放タイミングを確認し、Release関数、Destroyどちらでも解放されることが分かりました。
2種類どちらを使った方が良いかという考察をしています。

普通に考えると、RenderTexture自体がクラスなのでGCを抑えるためにnewの回数は減らしたいので、DestroyせずReleaseを使って再利用可能にしておくのが良いのではないかという予測が立ちます。

実際に実機とつないだUnity ProfilerでCPUプロファイリングして確認します。

環境

  • macOS HighSierra 10.13.6
  • iPhone6s iOS12.1
  • Unity2018.3.0f2
  • Xcode10.1


以下の表はW2048×H2048px ARGB32bit 1枚のRenderTextureの生成、Blit、Release、Destroyをプロファイリングした結果です。

処理 GC Alloc 処理時間
RenderTexture生成 4.9KB 6.82ms
RenderTextureのDestroy 0B 0.03ms
RenderTextureのBlit 0B 0.122ms
RenderTextureのRelease 0B 0.04ms

結果としてこのような数値が出揃いました。
やはり生成にはヒープメモリを使用しているようで、5KBほど計上されています。あと、処理時間もまあまあ重いです。

この数値から考えると生成は最小限にとどめてReleaseとBlitを繰り返すというのが良いのではないかと思います。

未解決な部分

試しにRenderTextureを2枚目の生成をした結果がコチラです。

処理 GC Alloc 処理時間
RenderTexture生成(Destroy後2回目) 64KB 0.09ms

処理時間、メモリ使用量ともに激減しています。
この理由を知っている方、教えてください。わかりません。

まとめ

未解決な部分はさておき、後者でもヒープメモリは使用するため、前者の結果の通り、Releaseを使用するのが良いでしょう。

ただし1度しかつかないというアプリ仕様であればDestroyしちゃっても問題ないでしょう。
あくまでRenderTextureのnew回数を減らすという点での考察結果となります。


以上