45K Views
March 19, 23
スライド概要
UnityでのXRアプリ開発に関連する過去のスライドから、パフォーマンスにパフォーマンスに関連するものを寄せ集めて、スライドにまとめました。
unity2021~2022に適用する内容になっています。
META QUEST開発時のパフォーマンスあれこれ UNITY 2021-2022
大久保 聡 Mail [email protected] Twitter @followapp
META提示の指標 https://developer.oculus.com/documentation/unity/unity-perf/?locale=ja_JP ドローコール数と、メッシュの数の目安 プラットフォーム ドローコール 説明 Quest 1 50-150 重いシミュレーション Quest 1 150-250 中程度のシミュレーション Quest 1 200-400 軽いシミュレーション Quest 2 80-200 重いシミュレーション Quest 2 200-300 中程度のシミュレーション Quest 2 400-600 軽いシミュレーション プラットフォーム 三角形の数 Quest 1 350k-500k Quest 2 750k-1.0m
解析ツール OVR METRICS TOOL Metaの開発者サイトよりダウンロードし、APKをインストール。 OVR Metrics Toolを起動した後、測定したいアプリを起動する。
解析ツール META QUEST DEVELOPER HUB Meta Quest Developer Hubのパフォーマンスアナライザー
解析ツール UNITY PROFILER ビルド設定で、Development Build(開発ビルド)、Autoconnect Profiler(自動接続プロファイラー)を選択。 Build and Run(ビルドして実行)を押して、Meta Questヘッドセットでビルドして実行します。ビルドが正常に 完了すると、Profiler(プロファイラー) が表示されます。
PROJECT SETTINGSのPLAYERタブ RESOLUSION AND PRESENTATION SETTINGS Resolusion and Presentation Settingsを開き、Use 32-bit Display buffer にチェックします。 画面描画時にはフレーム全体を保持するバッファを使用し、 フレーム単位で一気に描画処理を行います。 描画が間に合 わなくても、フレームバッファを使用してディスプレイの 表示を継続します。このフレームバッファを32bit色にして 階調がなめらかにします。 Disable Depth and Stencil のにチェックを外します。 デプスバッファとは、モデルまでのZ距離を格納するための バッファです。ステンシルバッファとは、物体の重ね合わ せなどにより描画しなくても良い領域を判定するための バッファです。描画しなくて良いものを省くことでパ フォーマンスを向上させます。
PROJECT SETTINGSのPLAYERタブ OTHER SETTINGS Color SpaceでLinearが選択できます。Linear color はよりリアルなライティングを生成します。 Graphics APIsを、Vulcanに変更。CPUが負荷が軽い。 Multithreaded Renderingにチェックします。 グラフィックAPI呼び出しをメインスレッドから別の ワーカースレッドに移動します。CPU負荷をさげること ができます。
PROJECT SETTINGSのPLAYERタブ OTHER SETTINGS ドローコールのバッチ処理は、メッシュを結合して、 Unity がより少ないドローコールでレンダリングできる ようにする方法です。 Static Batchingにチェックします。 静的ゲームオブジェクトに対して、Unity はそれらを 結合し、まとめて描画します。 Dynamic Batchingにチェックします。 かなり小さいメッシュに対し、その頂点を変換して多数の類 似したものを群にし、1回のドローコールで描画します。 GPU Compute Skinningにチェックします。 Skinningの処理をGPU側で実行します。 メッシュをボーンアニメーションに合わせて変形させる 場合の 膨大な頂点の変換処理を、シェーダー(GPU)で行 う事により処理を高速化する。 Graphics Jobsはチェックを外します。(デフォルト)
PROJECT SETTINGSのPLAYERタブ OTHER SETTINGS Keep Loaded Shaders Aliveにチェック このオプションを選択すると、起動時にすべてのシェー ダーがロードされます。これにより、アプリケーション の初期ロード時間が増加しますが、オンデマンドシェー ダーコンパイルによる問題は解決されます。オンデマン ドでシェーダーをコンパイルすることが問題になる場合 は、このチェックボックスをオンにします。
PROJECT SETTINGSのPLAYERタブ OTHER SETTINGS Prebake Collision Meshesにチェック 読み込み時にMeshColliderを計算します。このボックス をチェックすると、代わりにビルド時にMeshColliderが 生成されます。これにより、プロジェクトのビルドサイ ズが増加しますが、レベルの読み込み時間が短縮されま す。 APKのサイズに問題がない場合は、このチェック ボックスをオンにする。 Optimize Mesh Dataにチェック このボックスをチェックすると、メッシュを使用するマ テリアルによって参照されていないメッシュから頂点 データ(接線、法線、色、UVなど...)が削除されます。 このオプションを有効にすると、最終的なAPKサイズを 小さくすることができます。
PROJECT SETTINGSのAUDIOタブ オーディオ最高の没入感を得るために、すべてのゲーム でspatialize audioにすることをお勧めします。 spatialize audioでは、少なくともオーディオマネー ジャーで次の設定を変更する必要があります。 ・DSPバッファサイズを適切なレイテンシに設定します。 ・SpatializerプラグインをOculus Spatializerに設定し ます。
PROJECT SETTINGSのXR PLUGIN MANAGEMENT Stereo Rendering ModeをMultiviewに変更。 左右の目ごとに2回レンダリングする処理を、まとめてレンダリングすることで描画速度を向上させる。 FFR(Fixed Foveated Rendaring)もしくは、ETFR(Eye Tracked Foveated Rendaring)を使用する。視線の方 向の絵は高解像度に視野の周辺部は荒くレンダリングすることで性能を向上させる。前者はディスプレイの中心部 を高解像度に、後者はアイトラッキングで見ている場所を高解像度にレンダリングする。
スクリプトで動作設定① 解像度の変更、FFR、CPUの設定を調整 private float m_RenderScale = 0.9f; private OVRManager.FoveatedRenderingLevel m_FoveatedRenderingLevel = OVRManager.FoveatedRenderingLevel.High; private OVRManager.ProcessorPerformanceLevel m_ProcessorPerformanceLevel = OVRManager.ProcessorPerformanceLevel.SustainedHigh; // 解像度 XRSettings.eyeTextureResolutionScale = m_RenderScale; // FFR OVRManager.foveatedRenderingLevel = m_FoveatedRenderingLevel; // CPU・GPU OVRManager.suggestedGpuPerfLevel = m_ProcessorPerformanceLevel;
スクリプトで動作設定② リフレッシュレートの調整 private float m_refleshRate = 72.0f; // リフレッシュレート OVRPlugin.systemDisplayFrequency = m_refleshRate;
QUEST SUPER RESOLUTION Quest Super Resolutionは、低解像度でレンダリ ングを行った結果を、アップスケーリングして表示 することでパフォーマンスを改善する機能です。 Oculus Integration V.55から利用でき、OVR ManagerのSharpen Typeを設定することで利用 できます。 Normalは、オーバーヘッドの低いアルゴリズムの contrast adaptive sharpening (CAS)を利用。 Qualityは、バイリニアサンプリングによるぼやけ や階段状のアーチファクトを回避し、より滑らかな エッジ再構成を実現し、ハローアーチファクトを低 減する。
DYNAMIC RESOLUTION GPU負荷に合わせて解像度を動的に変更する仕組み。 Vulkanで使えない。 Unity 2022.3.5f1 + XR Plugin4.0 + Oculus Plugin 1.87 Unity 2021.3.28f1 + XR Plugin3.3 + Oculus Plugin 1.82
DYNAMIC RESOLUTION Oculus Integrationn v56から選択可能となりました。ターゲットデバイスにQuest3が追加されて います。 Unity 2022.3.5f1 + XR Plugin4.0 + Oculus Plugin 1.88
PROJECT SETTINGSのPHYSICSタブ 物理演算を使わないものは物理演算を無効にする Project SettingsのPhysicsにある、Auto Simulation と Auto Sync Transforms のチェックを外す。
UGUIのリビルド https://logmi.jp/tech/articles/320743 UnityのCanvasは、描画をまとめてバッファを作って、それを使って描画します。バッファを使い回すということ は、同じデータしか使えないことを意味しています。もしそのバッファの情報に変化があった場合、バッファ全部 を再構築するため負荷がかかります。 UIをenable/disableした場合。消したら当然非表示になるのでバッファは消えます。 マテリアル、バッチングが切り替えられた場合にも更新されます。 UIのRectTransform、UIの大きさが変わってしまった場合でも更新されます。 transformの親が変わった場合も更新されます。
UGUIを使わない選択 uGUIを使わない Canvasの書き換え(移動)すると、UIのリビルドが走る。VRではプレイヤーが動くとGUIがリビルドされるため、 パフォーマンスが劣化しやすい。uGUIをSpriteや不透明のメッシュなどに置き換えを行う。 SpriteをScene上に配置
テクスチャーをスプライトとしてインポートする 透明を持つテクスチャーをSpriteとして利用する際に、Mesh Typeを指定できる。 板ポリとするか、透明部分を除いたメッシュとするかの違い。 オーバードロー 頂点数 無 多 > < 有 少
オーバードローとは? UIが重なってあった場合、「色が塗られているか」「完全に透過しているか」を気にせずに色は塗られ ます。何度も塗ってしまう箇所がでてきます。「透明を塗って、その上に透明を塗って、その上に透明 を塗って」という場合で、これをオーバードローと言います。
READ・WRITEをオフにする CPUとGPUの両方からアクセス可能にするためのコピーが作成されるためメモリサイズが2倍になります。そのた め、実行時にTextureやModelに対して読み書き処理を行わない場合はOffにしておくことでメモリサイズを削減す ることができます。
MIPMAP 遠い画像に高詳細のTextureを使うのは処理負荷的にもったいない。そのため事前に遠景用のTextureを用意して おき、距離に応じて使いわける仕組みです。Mipmapを自動生成することもできます。 MIPMAPを使うことでメモリ使用量が増えるため、常に近くに表示するものに対しては作らないなど必要に応じて 作成する。
スクリプトでのTIPS トランスフォームは 2 回ではなく、1 回だけ動かす トランスフォームを動かす時は、Transform.SetPositionAndRotation を使って、位置と回転の両方を一度に更 新するようにします。 transform.position = new Vector3(0, 0,0); transform.rotation = Quaternion.Euler(0, 0, 0); ↓ transform.SetPositionAndRotation( new Vector3(0, 0, 0), Quaternion.Euler(0, 0, 0) );
重い処理を使わない https://baba-s.hatenablog.com/entry/2014/07/09/093240 GameObjectを検索するFind、FindObjectOfTypeは重いため極力使わないようにします。 呼び出し回数を少なくします、もしくはシーン上のオブジェクトが少ないときなどに利用します。
重い計算を使わない √の計算は重い。Vector3.magnitudeとかVector3.Distance()は②の計算を行います。①の状態で距離チェック を行うことてパフォーマンスを向上させることができます。 a b 𝑎2 = 𝑏 2 + 𝑐 2 𝑎 = 𝑏2 + 𝑐2 ① ② c float distance = (transform.position - other.transform.position).sqrMagnitude; if(distance < targetDistance * targetDistance){ //処理 }
OVR PROFILERの指摘を対応 OVR Profilerをチェック(非推奨になりました。Oculus Project Setup Toolを使うこと)
OCULUS PROJECT SETUP TOOL Project SettingsのOculusにあるChecklistを確認し、Outstanding IssuesとRecommended Itemsを確認する。パフォーマンス系の推奨項目をチェックし対応する。
サウンド回り(BGM) BGM(アプリ起動直後に使う) Load In Background: オフ Load Type: Streaming Commpression Format: Vorbis Quality: 1~50 Sample Rate Setting: Optimize Sample Rate BGM(アプリ起動直後に使わない) Load In Background: オン Load Type: Streaming Commpression Format: Vorbis Quality: 1~50 Sample Rate Setting: Optimize Sample Rate
サウンド回り(効果音) https://kingmo.jp/kumonos/unity-audio-clip-recommend-setting/ SE(元ファイルサイズ 1MB前後-ジングルなど) Load In Background: オン Load Type: Compressed In Memory Commpression Format: Vorbis Quality: 1~50 Sample Rate Setting: Optimize Sample Rate SE(頻繁に使う) Load In Background: オン Load Type: Decopmpress On Load Commpression Format: ADPCM Sample Rate Setting: Optimize Sample Rate 頻繁に使う場合はCPU負荷が軽い Commpression Format: ADPCMにするのがオススメ。
サウンド回り参考 CPU負荷 データサイズ https://kingmo.jp/kumonos/unity-audio-clip-recommend-setting/ Memory使用量
OCCLUSION CULLING あるオブジェクトが他のオブジェクトに隠されていて現在カメラに映らないときに、オブジェクトのレンダリングを除 外する機能です。 隠すもの(Occluder)と隠されるもの(Occludee)の対象をStaticで設定します。 Window-> Occlusion Cullingから、Windowを開きます。
OCCLUSION CULLINGのBAKE オクルージョンカリングをBAKEして、Visualizeモードに変更します。 カメラを移動してカリングが効いているか確認します。
ENVIRONMENTをSKYBOX化① 環境(背景)を360度画像として作成しSkyboxに設定 する。Reflection Probeを配置する。 Reflection Probeの位置の360度画像を作成するに はライトマップのベイクすれば良い。画像の解像度は Cubemap Capture Settingsで行う。 作成する 画像の解像度
ENVIRONMENTをSKYBOX化② 作成できたexrファイルをSkyboxに指定することでメッシュをレンダリングするのではなく、環境 (背景)を画像として表示する。 作成された画像 TypeをNoneに変更
開発時の時間の節約設定 テクスチャ圧縮をビルドする時のみにする アセットインポートやスイッチプラットフォームが早くなる Unity2021以降 以前 Unity>Preferences>Asset Pipeline Unity>Preferences>General>Compress Texture(Assets) on Importオフ エディターでPlayの待ち時間を短縮 ※弊害もあるのでKeijiroさんのYoutube確認。 Edit>Project Settings>Editor>Enter Play Mode Settings Enter Play Mode Options オン Relod Domain オフ Relod Scene オン
お金で解決する① Mesh Baker テクスチャーやメッシュをまとめる機能で、ドローコールを減らす。
お金で解決する② Poly Few LODの作成と設定を自動化できる機能。遠くのものは雑なメッシュ削減したモデルを使うことで性能向上させる。
POLY FEW Poly FewのコンポーネントをLODを作成したいモデルに追加する。 チェックボックスの設定や、作るLODの数や削減量の設定を行う。 Generate LODを押すと。LODモデルの作成と、LOD Groupの設定を自動でやってくれる。
お金で解決する③ URP14での動作怪しい Fast Mobile Post Processing URPにも対応した軽量のポストプロセス。