東海エリアを中心に活躍するVRクリエイター集団のページ

ベストプラクティス:モバイル

本コンテンツはOculusVR社のOculus Unity Mobile Integration Guideを日本語訳したものです。
※Unity開発に必要なもののみ翻訳しているため、一部省略されている箇所があります
翻訳内容に関する問題・指摘などあれば、訳者:@kimi_dropcまでご一報ください。

ベストプラクティス:モバイル

このセクションは、Android Unityアプリの動作を良好にするためのガイドラインになります。

パフォーマンスはVRアプリケーションの重要なポイントですが、モバイル開発についての各制限については、特段の配慮が必要です。

このドキュメントを読む前に、デザインガイドラインとモバイルVRデザインパフォーマンスのガイドラインにおける”初期タイトルのパフォーマンスアドバイス”を確認してください – モバイルSDKドキュメントから見つけることができます。

CPUの最適化

VRアプリケーションやゲームでパフォーマンスすを出すためには、実装方法の特徴を慎重に考慮する必要があります。シーンは常に60 fpsで実行する必要があり、ゲーム内でプレイヤーがいるポイントでhitchingやlaggyが発生しないようにする必要があります。

  • シーン内のゲームオブジェクトやコンポーネントの総数に留意する。
  • 効率的にゲームデータとオブジェクトをモデル化することで、メモリを確保出来ます。
  • Update() または FixedUpdate()内で計算するオブジェクトの数を最小限に抑えます。
  • 不要な物理シミュレーションを減らすか、破棄します。
  • 頻繁に使用されるエフェクトやオブジェクトを再出現させる場合、実行時に新しいオブジェクトを割り当てるのではなく、オブジェクトプールを使用してください。
  • プールされたAudioSourceか、PlayOneShotではゲームオブジェクトに割り当てられた時に音を鳴らし、削除された時に音声の再生が完了するようにする。
  • 可能な限り高度な数学を用いた計算は避けてください。
  • フレームレートを向上させるため、頻繁に使用するcomponentsとtransformはキャッシュしてください。
  • ハイコストなコードを特定し、必要に応じて最適化するために、Unity Profilerを使用してください。
  • フレーム毎に発生するガベージコレクション(GC)の割り当てを特定し、排除するためにUnity Profilerを使用してください。
  • 通常のプレイ中にパフォーマンスのスパイクを特定し、排除するためにUnity Profilerを使用してください。
  • UnityのOnGUI()のコールをしないでください。
  • ジャイロや加速度計を有効にしないでください。現在のバージョンのUnityでは、これらの機能はハイコストなディスプレイコールを呼び出すトリガーになります。
  • モバイルアプリとゲーム開発のためのすべてのベストプラクティスは、概ね適用されます。

:Unity ProfilerはUnityFreeでは使用できません。

レンダリングの最適化

アプリ構築における最重要点は、最初からパフォーマンスに慎重になることです。

  • draw call を低めに保つ。
  • テクスチャの使用量と解像度、ピクセル数に留意する。
  • ジオメトリの複雑さを最小限にしてください。
  • fillrateに留意する。
描画呼び出しを減らす

draw callの合計数を最小限にしてください。フレーム毎100未満のdraw callが目安になります。

Unityには、バッチ処理やカリングなどのdraw callを減らす機能がいくつか組み込まれています。

Draw Callバッチ処理

Unityは、実行時に複数のオブジェクトを単発のドローコールで描画するためにオブジェクトを組み合わせます。これにより、CPUのオーバーヘッドを減らすことができます。

ドローコールバッチングには、StaticとDynamicの2種類あります。

Staticバッチ処理は、移動、回転、スケールしないオブジェクトに使われ、各オブジェクトに明示的に設定しなければなりません。オブジェクトにStaticを設定するには、InspectorにあるStaticのチェックボックスにチェックを入れます。
(※スクショあり)

注:Static batchingはUnityFreeでは使用不可

Dynamicバッチ処理は、移動しているオブジジェクトに使用され、また、同じマテリアルを共有している、リアルタイムシャドウを使っていない、マルチプルシェーダーを使っていない等の、一定の基準を満たしたオブジェクトに自動的に適用されます。

Dynamicバッチ処理についての詳細は以下参照
https://docs.unity3d.com/Documentation/Manual/DrawCallBatching.html

 Culling

Unityは、Per-Layer Cull Distanceを使って、カメラのper-layer culling distancesを手動で設定する機能を提供しています。
この機能は、一定の距離から見えるシーンに、影響を与えない小さなオブジェクトをCullingするために有用かもしれません。

カリングする距離の設定の詳細については以下参照。
http://docs.unity3d.com/ScriptReference/Camera-layerCullDistances.html

また、Unityは、Integrated Occlusion Cullingシステムを持っています。初期のVRタイトルへのアドバイスは、”open worlds”の代わりに、適度な”scene”を大事にすることです。Occlusion Cullingは、適度なシーンには過剰かもしれません。

Occlusion Cullingシステムについての詳細は以下参照。
http://blogs.unity3d.com/2013/12/02/occlusion-culling-in-unity-4-3-the-basics/

メモリ帯域幅の削減

  • Texture Compression:テクスチャ圧縮は、大幅にパフォーマンスを向上させます。 ETC2圧縮テクスチャフォーマットはおすすめです。
  • Texture Minimaps:ゲーム内のテクスチャでは常にminimapsを使用します。Unityでは、Textureのインポート時にminimapsを自動的に生成します。minimapsオプションを使うためには、texture inspectorのTexture TypeをAdvancedにしてください。
  • Texture Filterring:Triliner filteringは、多くの場合、VRとって良いアイデアです。Triliner filteringは、パフォーマンスコストを抱えているものの、それ相応の使う価値があります。Anisotropic filteringも同様に使用されることはありますが、フラグメントごとに、単一のテクスチャルックアップになるようにします。
  • Texture Size:ジオメトリの細かさに合わせたテクスチャを使います。例えば、より多くのポリゴン数を持ったメッシュでは高解像度のテクスチャを使います。パフォーマンスの観点から見ても、ほぼ自由に使えるくらい豊富なテクスチャメモリがあります。Asset Storeのテクスチャは、大抵モバイル向けにとって無駄な解像度と言われています。大抵の場合、明確な見た目の差が出ないままテクスチャのサイズを小さくすることができます。
  • Framebuffer Format:ほとんどのシーンは、16ビットデプスバッファの解像度で動作するように構築する必要があります。さらに、もしあなたの世界が、主に圧縮テクスチャで事前にライティングされる場合、16ビットのカラーバッファを使用することができる。
  • Screen Resolution:Screen Resolutionを低解像度に設定することは、Unity Appのサイズ的なスピードアップに繋がります。

 

ジオメトリの複雑の軽減

ジオメトリの複雑さは最小限にとどめてください。 各スクリーンのstatic trianglesは、50,000が目安です。

モデルのVERT数がモバイルフレンドリーであることを確認してください。一般的に、アセットストアのアセットは、Hi-Fiであり、モバイル用にチューニングが必要になります。

UnityProには、オブジェクトが一定の距離から表示される際に、低解像度のメッシュを表示する、Level of Detail Systemがビルドインされている。(Free版では使用不可)
設定方法の詳細については、how to set up  a LODGroup for a modelを参照してください
https://docs.unity3d.com/Documentation/Manual/LevelOfDetail.html

vertex shadersがモバイルフレンドリーであることを確認してください。ビルトインシェーダを使用する場合、モバイルまたはUnity version of the shaderをおすすめします。

vertexの計算を減らすために、出来るだけテクスチャにその詳細をBakeしてください。
例:baked bumpmapping as demonstrated in the Shadowgun project: https://docs.unity3d.com/430/Documentation/Manual/ iphone-PracticalRenderingOptimizations.html

あなたのシーンを構築するときにゲームオブジェクト数に留意してください。シーン内のゲームオブジェクトとレンダラーが増えるほど、メモリ消費量が増え、レンダリングとカリングに時間がかかります。

ピクセルとオーバードローを削減

ピクセル:出来るだけテクスチャに、その詳細をBakeすることで、ピクセル計算を減らしてください。
例えば、fragment shaderの計算を減らすために、specular highlightsをテクスチャにBakeする、など。

fragment shaderがモバイルフレンドリーであることを確認してください。ビルトインシェーダを使用する場合、モバイルまたはUnity version of the shaderをおすすめします。

オーバードロー:ユニティ不透明なキュー内のオブジェクトは最小限にするために、深さテストを使用して順序をバックアップする前に描画されている

オーバードロー:Unity内のキューが不明確なオブジェクトはオーバードロー(奥のオブジェクトが描画された後に手前のオブジェクトで無駄に上書きされること)を最小限に抑えるために深度テストを使用して手前から奥の順に描画されます。
しかし、キューが明確なオブジェクトはオーバードローを前提に奥から手前の順にレンダリングされます。
アルファブレンドされたジオメトリの重なり(例:密度の高いパーティクルエフェクト)とフルスクリーンポストプロセスエフェクトは避けてください。

アルファブレンドのジオメトリ(例えば、緻密なパーティクルエフェクト)とフルスクリーンの後処理効果を重複しないようにしてください。

ベストプラクティス

  • バッチフレンドリーにしてください。 可能であれば共有マテリアルかテクスチャアトラスを使ってください。
  • ライトマップ、スタティックジオメトリを使用してください。
  • キャラクターと動くオブジェクトに対しては、dynamic lightingよりLight Probesを選んでください。
  • 可能な限りのテクスチャに詳細をベイクしてください。 例えば、鏡面反射、アンビエントオクルージョン。
  • 目ごとに1つのビューだけレンダリングします。シャドウバッファ、反射、マルチカメラのセットアップなどは無くしてください。
  • パスレンダリングの数を最小限にしてください。 dynamic lighting無し、post effects無し、バッファは解決しない、シェーダでgrabpass使用しない、など。
  • アルファテスト/pixel discard transparencyを避けてください。アルファテストは、高いパフォーマンスオーバーヘッドが発生します。 可能であれば、アルファブレンドに置き換えてください。
  • アルファブレンドによる透明度最小限に保ってください。
  • テクスチャ圧縮を使用してください。 ETC2がおすすめ。
  • メインフレームバッファにMSAAを有効にしないでください。MSAAは、Eye Render Texturesで有効にすることができます。

設計上の考慮事項

まだ行っていない場合は、 設計ガイドライン 確認してください 。
https://developer.oculus.com/documentation/#filter=mobile

スタートアップ手順

素晴らしいVR体験のためには、ユーザーが常に適切な三次元立体画像を見えるように、全てのグラフィックがレンダリングされなければなりません。さらに、ヘッドトラッキングは常に維持されていなければなりません。

アプリケーションの起動時にこれを行う方法は、SDKExamples Startup_Sample sceneで、例示されています。

  • 黒一色のスプラッシュ画像の表示は、できる限り最小時間にします。
  • 3Dロゴと三次元方向のウィジェットとプログレスメーターがある小さなテストシーンは即時ロードされます。
  • スモールスタートアップシーンがアクティブになっている間、メインシーンはバックグラウンドでロードされます。
  • メインシーンのロードが終わったら、スタートシーンはメインシーンへ、フェードエフェクトによって遷移します。

ユニバーサルメニューの取り扱い

Universal Menuを立ち上げのためには、戻るキー長押しし、現在のアプリケーションを終了し、Oculus Homeアプリケーションのメニューに戻るか確認するためには、戻るキー短押しをします。

この機能の使用例は、SDKExamples GlobalMenu_Sample sceneにあります。

アプリケーションメニューのオプションやアクセスの詳細については、Universal Menuのドキュメントに記載されています。
https://developer.oculus.com/documentation/#filter=mobile

ユニティプロファイリングツール

上記のガイドラインに従っていても、シーンのfpsが60に達しないことがあります。
次のセクションでは、Unityが提供するAndroidアプリケーションのボトルネック診断ツールの詳細について説明します。
さらなるプロファイリングツールについては、Performance Analysisのドキュメントを参照してください。

Unity Profiler

Unity ProにはProfilerがビルドインされています。
Profilerはボトルネックを特定するために役立つ、フレーム毎のパフォーマンスメトリクスを提供しています。
adbかWiFiを使ってAndroidデバイス上で実行しているアプリケーションのプロファイルを行うことができます。
デバイスのリモートプロファイリングの設定方法の手順については、以下のUnityのドキュメントのAndroidのセクションを参照してください。

https://docs.unity3d.com/Documentation/Manual/Profiler.html。

(※スクショあり)

Unityプロファイラは、Rendering・Scripts・Physics・GarbageCollector・VsyncのCPU使用率を表示します。
また、Rendering Statistics(レンダリング統計)、Memory Usage(メモリ使用量・オブジェクト型ごとのメモリ使用量の内訳を含む)、AudioとPhysics Simulationの統計に関する詳細な情報も提供しています。

AndroidのGPU使用量には対応していません。

Unity profilerは、アプリケーションのパフォーマンスメトリクスしか表示しません。想定した通りのパフォーマンスが出ない場合、システム全体の情報を集める必要があるかもしれません。

レンダリング統計を表示する

UnityでGameView上のStatsボタン(下記のスクリーンショットの右上の赤い丸で囲んでいる箇所)を押すと、GameViewでFPSやドローコール、ポリゴン数、頂点数やVRAM使用量などといったリアルタイムレンダリングの統計情報をオーバーレイで表示するオプションを提供します。
(※スクショあり Figure 8: VrScene: Tuscany)

GPUのオーバーロードを表示する

Unityはシーンのオーバードローを表示するための特別なレンダーモードを提供しています。
Scene ViewのControl Barから、Render ModeのドロップダウンからOverDrawを選びます。
このモードでは、半透明の色はオーバードローの「ヒートマップ」を蓄積します。
彩度の高い部分は多数のオーバードローが行われていることを表しています。

このモードでは、半透明の色はより多くの色飽和オーバードロー”ヒートマップ」を提供する蓄積されます

(※スクショあり Figure 9: VrScene Tuscany)

PAGETOP
Copyright © 近未来ラボ All Rights Reserved.
Powered by WordPress & BizVektor Theme by Vektor,Inc. technology.