VRのための最適化

確認済のバージョン: 5.3

-

難易度: 初級

はじめに

使用するプラットフォームで目標フレームレートを達成することが、酔いを引き起こさない快適な VR 体験を提供する上では非常に重要です。最適化は VR 開発において必要不可欠です。他の一部のプラットフォームと異なり、VR の場合は、開発後期に初めて最適化を行うのではなく、早期の時点で、頻繁に最適化を行うことが推奨されます。また、定期的にターゲットのデバイスでテストを行うことも有効的です。

VR は、非 VR のプロジェクトと比較して計算コストが高くなります。これは主に、全ての要素を左右のそれぞれの目に関して 1 回ずつ描画する必要があるからです。このため VR 体験を作り出すに当たっては、よくある問題を把握しておくことが大切です。事前に問題を把握していれば、それらを回避する形でプロジェクトを設計することで、後々余計な作業が発生するのを防ぐことができます。

モバイル向けの VR 開発は特に難易度が高くなる傾向にあります。VR アプリケーションの実行によるオーバーヘッドが発生するだけでなく、モバイルデバイスはデスクトップ PC に比べて遥かにパワーが低いため、最適化が非常に重要になります。

目標フレームレートの達成が非常に重要となるため、可能な最適化は全て行うことが推奨されます。コードもできる限り最適化してください。詳細は Unity の コードの最適化に関するガイド をご覧ください。

Oculus が提供する参考資料

Oculus のウェブサイトには VR の最適化に関する情報が豊富に提供されています。まずはこちらの内容に目を通されると役に立つでしょう。

https://developer.oculus.com/documentation/

http://static.oculus.com/sdk-downloads/documents/Oculus_Best_Practices_Guide.pdf

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game/

https://developer.oculus.com/blog/squeezing-performance-out-of-your-unity-gear-vr-game-continued/

Unity エディターの最適化ツール

Unity には VR コンテンツの最適化に役立つツールや技術が数多く搭載されています。

プロファイラー

プロファイラーを使用すると、各フレームのレンダリングに掛かっている時間の長さを把握できます。この情報は CPU・レンダリング・メモリ・オーディオ・物理・ネットワークの項目別に確認できるようになっています。パフォーマンス状況を調査し、どこに最適化が必要か把握するためには、プロファイラーの使用方法を理解することが不可欠です。

プロファイラーについての詳細は、以下のリンクをご覧ください。

https://docs.unity3d.com/ja/current/Manual/Profiler.html

https://unity3d.com/jp/learn/tutorials/topics/interface-essentials/profiler-overview-beginners

https://unity3d.com/jp/learn/tutorials/topics/interface-essentials/introduction-profiler

フレームデバッガ

フレームデバッガを使用すると特定のフレームでゲームの再生を凍結させてドローコールをひとつひとつ確認できるので、シーンがどのように構成されているか把握することができます。不要なオブジェクトがレンダリングされていることが判明するかもしれません。この情報は、フレームごとのドローコールの数を削減する上で非常に役立ちます。

フレームデバッガに関する詳細は、以下のリンクをご参照ください。

https://docs.unity3d.com/ja/current/Manual/FrameDebugger.html

https://unity3d.com/jp/learn/tutorials/topics/graphics/frame-debugger

VR の最適化の基礎

最適化は、非常に幅広い事柄が関わるトピックであり、条件もプラットフォームや個々のプロジェクトによって異なります。これを踏まえ、以下の解説は項目別に分けてご提供しています。

基本的には VR 開発にも既存の最適化方法が適用可能ですので、既存の知識をしばしば応用することができます。

ジオメトリ

VR 内に表示されることのない面は全てジオメトリから削除しましょう。一度も表示されない要素をレンダリングする必要はありません。例えば、食器棚の背面が壁に面していて一切ユーザーの目に触れないなら、その面は一切モデル含めないようにします。

メッシュはできる限りシンプルにします。ターゲットのプラットフォームによっては、テクスチャあるいは視差マッピングやテッセレーションによってディテールの追加を行うことも検討されると良いでしょう。ただしこれによってパフォーマンスに影響が出ることもあります。またプラットフォームによっては、この方法が適さない、あるいは可能でない場合もあります。

オーバードロー

Overdraw ビューでは、別のオブジェクトの上に重なって描画されているオブジェクト(GPU 時間が無駄に消費される原因)を確認することができます。オーバードローはできる限り削減するようにしましょう。シーンビューコントロールバー を使用すると、Scene ビューでオーバードローを表示することができます。

Overdraw メニュー

通常のビュー

Maze の通常のビュー

Overdraw 表示モードのビュー

Maze のオーバードロー表示

詳細度(LOD)

LOD(Level Of Detail) レンダリングを使用すると、特定のオブジェクトに関して描画される三角形の数をカメラからの距離が遠くなるに従って減らすことができます。全てのオブジェクトがカメラから近い距離に同時に位置することがない限りは、LOD によってハードウェアへの負担を軽減し、レンダリングのパフォーマンスを向上させることができます。これを行うには、LOD コンポーネントを追加し、カメラから遠距離にあるグループに詳細度の低いメッシュを使用します。

LOD LOD

Simplygon を使用すると、LOD 用のアセット準備のうち大部分を自動化することができます。

ドローコールバッチング

ドローコールは、Static Batching(静的バッチング)や Dynamic Batching(動的バッチング)を使用して、できる限りバッチ処理しましょう。パフォーマンスを大幅に向上させることができます。Unity マニュアルのドローコールバッチングのページをご覧ください。

ライトマッピング

動的ライティングは可能な限り排除し、リアルタイムシャドウの使用は避けてください

詳しくは、Unity のライティングとレンダリングに関するガイドをご覧ください。

ライトプローブ

ライトプローブ を使用すると、シーン内の特定の箇所のライティングをサンプリング(抽出)し、それを動的オブジェクトに適用することができます。これは比較的素早く実行され、往々にして素晴らしい結果をもたらします。

リフレクションプローブ

リフレクションプローブ は環境のキューブマップを保存することによって写実的な反射をつくり出しますが、パフォーマンスに影響を及ぼす可能性があります。現時点では、リアルタイムモードのリフレクションプローブは処理に時間が掛かり過ぎるため VR での使用には向きません。

オクルージョンカリング

オクルージョンカリング を使用すると、ユーザーから見えないオブジェクトのレンダリングが行われないようにすることができます。例えば、閉まった扉の向こうの部屋などは見えないのでレンダーする必要はありません。

プロジェクトやターゲットプラットフォームの条件が許せば、オクルージョンカリングを実装してパフォーマンスを大幅に向上させることも可能です。

以下は錐台カリングの一例です。

錐台カリング

以下はオクルージョンカリングの一例です。

オクルージョンカリング

アンチエイリアス処理

アンチエイリアス処理は、画像を滑らかにして輪郭のギザギザを緩和してくれるので、VR では非常にお勧めです。Forward Rendering を使用している場合は Quality Settings(画質設定)で MSAA(Multi-Sample Anti-Aliasing/マルチサンプリング)を有効にすることが可能かもしれません。MSAAは Gear VR のためにできる限り有効にしてください。

Deferred Rendering を使用している場合は MSAA は行えないので、ポストエフェクトとしてのアンチエイリアス処理 を有効にするか SMAA を使用されることもご検討ください。コミュニティに提供された参考例がこちらでご確認いただけます。

テクスチャ

基本的に、できるだけテクスチャアトラス を使用して、テクスチャとマテリアルの使用量を減らすようにしましょう。

MeshBaker を使用すると上記を素早く簡単に行えます。MeshBaker でテクスチャやメッシュやマテリアルをベイクするとパフォーマンスの向上が期待できます。

Turbo Button Inc の Holden 氏による Oculus Connect 2 での講演で、最適化全般について、また MeshBaker に使用について説明しています。

法線マップは通常、VR では見た目の質が落ちますので避けた方が賢明です。テクスチャに関しての情報は、 Oculus ドキュメンテーションのレンダリングに関するページをご覧ください。

シェーダー

可能な箇所では、なるべく最も基本的なシェーダーを使用するようにしてください。Gear VR では負荷の低い Mobile > Unlit (Supports Lightmap) シェーダーを使用し、シーンにライトマップを適用することも検討されると良いでしょう。

全画面エフェクト

全画面エフェクト は負荷が高いため、Gear VR では一切使用しないようにすることをお勧めします。

Quality Settings(画質設定)

Quality Settings(画質設定) では、プロジェクトのビジュアルに関する様々な設定が行えます。各種プロパティを変更することで、画質と引き換えにパフォーマンスを向上させることができます。

RenderScale

VRSettings.renderScale を使用すると、シャープネスと引き換えにパフォーマンスを向上させることができます。詳細情報と参考例は、『VR 開発を始めよう』 の章でご確認いただけます。

非同期読み込み

パフォーマンス向上のためにプロジェクトをシーンごとに分割する必要がある場合は、次のシーンの読み込み時にヘッドトラッキングが停止(フリーズ)してしまわないようにご注意ください。これは、酔いの原因となります。

これを回避するためには、SceneManager.LoadSceneAsync を使用して、次のシーンを非同期的に読み込みながらヘッドトラッキング付きの読み込み画面を提供することも可能です。

Sample シーンで使用されている最適化方法

サンプルシーンには、Gear VR と DK2 で高パフォーマンスを実現するための様々な最適化手法が使用されています。

一つのプロジェクトが両方のプラットフォームをターゲットにしているため、性能の低い方のハードウェア(この場合は Gear VR)に基準を合わせています。低ポリゴンのアートスタイルに、数種類の基本的な色を使用して、環境内で各アイテムが際立つように工夫しています。

Forward Rendering を使用しているため、メニューの Edit > Project Settings > Quality Settings(画質設定) で 4x MSAA(Muiti Sampling Anti Aliasing) を有効にして画質を向上させています。

Quality Settings の MSAA の設定

それでは、サンプルシーンで使われている手法を見てみましょう。

Menu シーンの最適化

他の全てのシーン同様、低ポリゴンのアセットを使用しており、リアルタイムのライティングは使用していません。

メニューパネルには、一連の画像に対して 1 つの独立したアルファチャンネルを設定するために、SeparableAlpha と呼ばれるカスタムシェーダーを使用しています。つまり、全ての個々のフレームに専用のアルファチャンネルは必要ないということです。その結果ファイルサイズが縮小され、一部のエイリアス処理が削除されます。

Flyer シーンの最適化

Flyer では、ランタイムで フォグ を有効にすることで、生成されたオブジェクトが視界に突然現れることのないようにしています。またこれにより視界距離を短縮することができるので、描画の必要なオブジェクトの数を削減することが可能となっています。

小惑星は頂点数が少ないため動的バッチングを使用してドローコールを削減することが可能となっています。

オブジェクトを再利用するために、レーザーと小惑星とゲートを扱う オブジェクトプール を作成しました。これにより、負荷の高い Instantiate コールが定期的に行われるのを回避しています。

ここで注目すべきは Flyer Vehicle(飛行機)のアルベドテクスチャです。これは、Detail Map スロットで二次的 UV チャンネルを用いることで、少数の色セットを使用するように最適化されています。このおかげで全体のテクスチャサイズが削減されています。

Maze シーンの最適化

Maze の環境にはライトマップを用いることでランタイムでのパフォーマンスを向上させています。特に Gear VR においてはパワーの低いモバイルデバイスでプロジェクトが実行されるため、この効果が顕著に表れます。もしライトマップを使用していなければ、リアルタイムライティングのない、最低限のエフェクトだけを使用した簡単なシーンです。

Shooter180 (Target Gallery) シーンおよび Shooter360 (Target Arena) シーンの最適化

他のゲーム同様、これらのシーンでも低ポリゴンのアートスタイルを採用しており、標的にはオブジェクトプーリングを使用し、また動的バッチングを使用するために頂点数を少なくしています。

以上、本章では最適化に関するいくつかの基本的な事項と、Unity のビルトインツールを使用したパフォーマンスの分析方法、およびフレームレート向上のためのヒントをご紹介させていただきました。

Oculus のウェブサイトに、本章の内容に関連した詳しい資料が数多く提供されています。

次章、参考資料一覧 では、この他に役立つ参考資料のリンクをさらにご紹介しています。