>100 Views
March 19, 23
スライド概要
UnityでのXRアプリ開発に関連する過去のスライドから、パフォーマンスにパフォーマンスに関連するものを寄せ集めて、スライドにまとめました。
unity2021~2022に適用する内容になっています。
META QUEST開発時のパフォーマンスあれこれ UNITY 2021-2022
大久保 聡 Mail [email protected] Twitter @followapp
PROJECT SETTINGSのPLAYERタブ RESOLUSION AND PRESENTATION SETTINGS Resolusion and Presentation Settingsを開き、Use 32-bit Display buffer にチェックします。 Disable Depth and Stencil のにチェックを外します。
PROJECT SETTINGSのPLAYERタブ OTHER SETTINGS Color SpaceでLinearが選択できます。Linear color はよりリアルなライティングを生成します。 Graphics APIsを、Vulcanに変更。CPUが負荷が軽い。 Multithreaded Renderingにチェックします。 グラフィックAPI呼び出しをメインスレッドから別の ワーカースレッドに移動します。CPU負荷をさげること ができます。 Static Batchingにチェックします。 同じマテリアルの複数のStaticなオブジェクトがある際、 それをあらかじめ一つにまとめて描画して。Draw Call を減らすことができます。 Dynamic Batchingにチェックします。 GPU Skinningにチェックします。 Skinningの処理をGPU側で実行します。 Graphics Jobsはチェックを外します。(デフォルト)
PROJECT SETTINGSのPLAYERタブ OTHER SETTINGS Keep Loaded Shaders Aliveにチェック このオプションを選択すると、起動時にすべてのシェー ダーがロードされます。これにより、アプリケーション の初期ロード時間が増加しますが、オンデマンドシェー ダーコンパイルによる問題は解決されます。オンデマン ドでシェーダーをコンパイルすることが問題になる場合 は、このチェックボックスをオンにします。
PROJECT SETTINGSのPLAYERタブ OTHER SETTINGS Prebake Collision Meshesにチェック Unityは、読み込み時に物理メッシュを計算します。この ボックスをチェックすると、代わりにビルド時にメッ シュが生成されます。これにより、プロジェクトのビル ドサイズが増加しますが、レベルの読み込み時間が短縮 されます。 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;
PROJECT SETTINGSのPHYSICSタブ 物理演算を使わないものは物理演算を無効にする Project SettingsのPhysicsにある、Auto Simulation と Auto Sync Transforms のチェックを外す。
UGUIのリビルド https://logmi.jp/tech/articles/320743 UnityのCanvasは、描画をまとめてバッファを作って、それを使って描画します。バッファを使い回すということ は、同じデータしか使えないことを意味しています。もしそのバッファの情報に変化があった場合、Canvasに情 報をまとめて1回統合して、バッファを作り直す必要があります。 UIをenable/disableした場合。消したら当然非表示になるのでバッファは消えます。 マテリアル、バッチングが切り替えられた場合にも更新されます。 UIのRectTransform、UIの大きさが変わってしまった場合でも更新されます。 transformの親が変わった場合も更新されます。
UGUIを使わない選択 uGUIを使わない Canvasの書き換え(移動)すると、UIのリビルドが走る。VRではプレイヤーが動くとGUIがリビルドされるため、 パフォーマンスが劣化しやすい。uGUIをSpriteや不透明のメッシュなどに置き換えを行う。 SpriteをScene上に配置
テクスチャーをスプライトとしてインポートする 透明を持つテクスチャーをSpriteとして利用する際に、Mesh Typeを指定できる。 板ポリとするか、透明部分を除いたメッシュとするかの違い。 オーバードロー 頂点数 無 多 > < 有 少
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){ //処理 }
PROFILERの指摘を対応 OVR Profilerをチェック(非推奨になりました。)
サウンド回り(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モードに変更します。 カメラを移動してカリングが効いているか確認します。
開発時の時間の節約設定 テクスチャ圧縮をビルドする時のみにする アセットインポートやスイッチプラットフォームが早くなる 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の設定を自動でやってくれる。