[Unity] パフォーマンス改善Tips
今回はUnityで処理負荷を軽減させるために効果があった方法をいくつか紹介したいと思います。
経緯
UnityでVRヘッドマウントディスプレイのIdeaLens用にVRアプリケーションの実装をおこなう際に、PCでプレビューしている段階では問題がなかっても、IdeaLens実機で確認すると不定期に動画がカクつきパフォーマンスに問題が見られる現象が発生しました。
PCの処理能力と比較してIdeaLensはスマートフォン用のCPU(Exynos 7420)とGPU(Mali-T760 MP8)を搭載しているため、負荷を少しでも減らすよう工夫する必要がありそうです。
今回はそのような状況においてパフォーマンスの改善で効果があったと思われる対処方法をシェアしたいと思います。
全天球動画の解像度およびフレームレートを調整する
外部ツールのffmpegを使用して調整をおこないました。
https://www.ffmpeg.org/
動画再生時の負荷が少なくなるように、解像度とフレームレートをできるだけ下げる方向で調整します。
IdeaLens実機で確認をおこないながら、不自然にならない範囲で、調整します。
今回の例では解像度:2560×1280 、フレームレート:12 が最適なようでした。
ffmpegでエンコードをおこなうには以下のコマンドを実行します。
//解像度:2560x1280 、フレームレート:12 でエンコードする
ffmpeg -i original.mp4 -s 2560x1280 -r 12 encorded.mp4
全天球動画のTranscodeを有効にする
Unityの動画アセットのインスペクタからTranscodeの設定ができます。

Transcodeにチェックマークをつけて有効にします。
Bitrate Modeを可能な限り下げることで負荷を軽減することができます。
ただしTranscodeを有効にした場合、ブロックノイズが目立ってしまうこともあります。特にカメラのパン等が発生する動きの激しい動画の場合、Bitrate ModeをHighにしてもブロックノイズが目立ちましたので、その場合はTranscodeを有効にしないほうがいいのかもしれません。
使用済の動画プレーヤーはシーン遷移前に破棄するようにする
動画プレーヤーを使用した複数のシーン間をまたぐような処理が入っている場合、シーン遷移の前に使用済の動画プレーヤーを破棄するようにします。
//まず動画プレーヤーを設定しているゲームオブジェクトを取得します。
GameObject screen = GameObject.Find("Screen");
//次に動画プレーヤーのコンポーネントを取得します。
UnityEngine.Video.VideoPlayer vPlayer = screen.GetComponent<UnityEngine.Video.VideoPlayer>();
//動画プレーヤーを破棄します。
Destroy(vPlayer);
使用していないアセットをアンロードする
シーンの切り替え時など、区切りのよい箇所で、使用していないアセットをアンロードすることによって、メモリを節約することができます。
//使用していないアセットをアンロードする
Resources.UnloadUnusedAssets();
ガベージコレクションで不要になったメモリを解放する
上記のアセットをアンロードする処理に加えて、ガベージコレクションで不要になったメモリを解放する処理を追加します。
//ガベージコレクションで不要になったメモリを解放
System.GC.Collect();
木曜日担当:nishida
nishida at 2021年03月11日 10:00:48