こんにちは、Unityエンジニアのオオバです。
RenderTexture(レンダーテクスチャ)を使ってますか?
RenderTextureを使いこなすと、
Unityでの表現方法が爆上がるため
ぜひ覚えておきたい機能のひとつです。
👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!
RenderTextureとは?
そもそもRenderTextureとは何でしょうか?
RenderTextureを簡単にまとめると。
- カメラで映した内容をテクスチャとして扱える
- 実行中に生成し更新されるテクスチャ
- Texture2Dとは別物
カメラに写っている画像を、
そのままテクスチャとして使うことができる
特殊なテクスチャです。
では、RenderTextureは
どういう場面で使われるのでしょうか?
RenderTextureの用途
- 鏡のような表現
- ダイアログUIの背景にブラーをかける
- カメラ映像のカラー調整
このようにカメラの映像に対し何かをするとき、
映像の後加工(ポストエフェクト)にRenderTextureを使います。
RenderTextureはメモリを消費しがち
RenderTextureはランタイムで、
テクスチャを確保します。
画面全体を覆う表現をする場合、
その端末解像度分のメモリを使用します。
最近のスマホは解像度が高く、
画面全体を覆うRenderTextureを生成すると、
メモリを多く使用することになります。
RenderTextureのメモリ解放方法は、
正しく知っておきましょう。
2種のRenderTextureのメモリ解放
- Releaseメソッド
- Destroyメソッド
この2種類どちらを使った方が良のでしょうか?
メモリを解放する
- RenderTexture自体はクラス
- GCを抑えるためにnewの回数は減らしたい
DestroyせずReleaseを使って、
再利用可能にしておくのが
良いのではないかという予測が立ちます。
実機iPhone6sと接続したUnity Profilerで、
CPU負荷を計測してみます。
- 幅2048×高さ2048px
- フォーマットARGB32bit
上記のRenderTextureを1枚。
- new(生成)
- Blit
- Release
- Destroy
上の4種のメソッドをプロファイリングした結果がコチラ。
処理 | GC Alloc | 処理時間 |
---|---|---|
生成(new) | 4.9KB | 6.82ms |
Blit | 0B | 0.122ms |
Release | 0B | 0.04ms |
Destroy | 0B | 0.03ms |
ヒープメモリを確保するため、
生成には5KBほどGC Allocが計上されています。
処理時間も6msと負荷は高めですね。
Release、Destroyの負荷はほぼかかりません。
結論 RenderTextureは使い回す
この数値から考えると、
生成回数は最小限にとどめてReleaseとBlitを
繰り返すというのが良いです。
具体的にはコチラです。
- ゲーム開始時に必要なRenderTexture生成
- 使い終わったらRelease
- 再度使う場面でBlit
未解決な部分
試しにRenderTextureを2枚目の生成をした結果がコチラです。
処理 | GC Alloc | 処理時間 |
---|---|---|
RenderTexture生成(Destroy後2回目) | 64KB | 0.09ms |
処理時間、メモリ使用量ともに激減しています。
この理由を知っている方、教えてください。わかりません。
以上
この記事が気に入ったらフォローしよう
- macOS HighSierra 10.13.6
- iPhone6s iOS12.1
- Unity2018.3.0f2
- Xcode10.1