戯言日記

ホロレンジャーの戦いの記録

【翻訳】Performance recommendations for immersive headset apps

ハードウェアターゲット

Windows Mixed Reality Ultra PCは、discrete graphicsと追加の要件を備えたデスクトップとラップトップによって構成され、90Hzでの体験をサポートします。

Windows Mixed Reality PCは、内蔵graphicsと追加の要件を備えたデスクトップとラップトップによって構成され、60Hzでの体験をサポートします。

あなたの体験だけに合わせてWindows Mixed Reality Ultra PCをターゲットにすると、確かにより多くのパワーが得られますが、対象ユーザーを制限することにもなります。逆にWindows Mixed Reality PCを対象とする場合は、より多くのユーザーを対象としますが、ハイエンドのWindows Mixed Reality Ultra PCを使用しているユーザーには、独自のパフォーマンス価値を提供することはできません。したがって、VR体験のためのハイブリッドなアプローチが両者にとってのベストかもしれません。

試験目的で購入できるWindows Mixed Reality PCs と Windows Mixed Reality Ultra PCs のリストがまもなく公開予定です。

パフォーマンス

目標フレームレート

Windows Mixed Reality immersiveヘッドセットでのVR体験の目標フレームレートは、サポートするWindows Mixed Reality互換PCによって60Hzまたは90Hzになります。
現在使用しているPCでは、holographic frame duration(HolographicFrame Class (Windows.Graphics.Holographic) - UWP app developer | Microsoft Docs)を確認するか、Unityでデバイスのリフレッシュレート(Unity - Scripting API: XR.XRDevice.refreshRate)をチェックすることで、目標のフレームレートを判断できます。

CPU予算

近日公開。

コンテンツのガイダンス

Unityアプリケーションのパフォーマンスを最適化する

メインストリームでは2段階のプロセスでパフォーマンスを向上します。まず、アプリの全体的なパフォーマンスを可能な限り向上させることをお勧めします。次に、フレームレートを高く維持しつつも、できるだけ高いビューポート、及びクオリティを実現するために、定義済みのバケット間でビューポートやクオリティ設定を見つけることをお勧めします。我々は、Github上のUnityパッケージ(MixedRealityToolkit-Unity/External/Unitypackages at Dev_Unity_2017.2.0 · Microsoft/MixedRealityToolkit-Unity · GitHub)を介して、これら両タスクを支援するツールを提供しています。(注意: このパッケージには2つのバージョンがあります。使用しているバージョンに対応するものをご利用ください。) このパッケージには、現在のフレームレートのビジュアライザと、適応的なクオリティとビューポートマネージャが含まれています。ビジュアライザには、いくつかの数字を表示します。フレーム間の時間間隔、レンダリングに費やされた時間、現在の推定フレームレート、(互換性の仕様に基づいた)現在使用しているPCのターゲットフレームレート、現在のビューポートスケールファクタと現在のUnityのクオリティレベルです。ビジュアライザには、ビューポートのスケーリングやクオリティ設定を変更することができる入力バインディングがあり、フレームレートやビジュアルクオリティを満たす値を見つけるのを補助します。適応的なクオリティとビューポートマネージャは、アプリケーションのパフォーマンスに基づいてビューポートのスケールとクオリティ設定を更新します。

まず、提供しているリンクからFPSViewportQualityBundle.unitypackageをダウンロードしてください。プロジェクトで、Assets> Import Package> Custom Packageを選択します。
f:id:haikage1755:20170906185547p:plain
次に、Asset package を全てインポートします。
f:id:haikage1755:20170906185849p:plain
f:id:haikage1755:20170906185900p:plain
MixedRealityToolkit> Utilities> Prefabs> PerformanceにあるFPSCanvas prefabを見つけてください。プレハブをSceneのメインカメラの上にドロップすると目の前のcanvas上に情報が全て表示されます。'm'キーで表示のオン/オフを切り替えることができます。パフォーマンスの最適化を開始するには、まずUnity内で開発者設定ではない状態でビルドします。Visual StudioでターゲットをMaster、x64に設定し、デバッグなしで最小仕様のコンピュータ上で実行します。ゲームが始まると、即座にビューポートスケールとクオリティ値が変更できます。デフォルトのキーは '- viewport scale decrease by 0.05, 0.05 is minimum value; ',' - viewport scale increase by 0.05, 1.0 is the maximum value; ',' - decrease quality 1 step; '.' - increase quality 1 step.'です。

このツールを使用して、アプリの全体的なパフォーマンスを向上させるには、次の手順を実行します。

  • 最初に、実際のフレームレートとターゲットフレームレートとの比較を見てください。以下のような全体的な経験を通して、最大の変更が必要な場所を確認します。
    • フレームレートがシーン内でターゲットより一貫して低い場合には、ビューポートの倍率を低くしてみてください。もしこれによってフレームレートが向上されるならば、GPUの問題の可能性があり、シェーダの改善、ポリゴン数の削減、持続的なスクリーンスペースエフェクトの単純化が問題解決に役立つでしょう。逆にビューポートを小さくしてもFPSが改善されない場合は、CPUが問題の可能性があり、スクリプト、アニメーション、フィジクスの単純化が役立ちます。
    • ゲーム内のイベントでフレームレートが低下した場合、パーティクルや一時的なスクリーンスペースエフェクトといったものがフレームレートを低下させている可能性があります。パーティクルの数を減らしたり、スクリーンスペースエフェクトを単純化することで、同じエフェクトを提供しながら適切なフレームレートの改善を得られるでしょう。
  • アプリケーションでパフォーマンス問題の原因となっている可能性のものを特定したら、それらをデバッグするための良いツールはUnityプロファイラです。
    • 一度に1つのオブジェクトを切り替えて全体のレンダリング時間を比較することで、そのシーンで処理時間の多くを占めているシェーダーを見つけることができます。レンダリング時間が長いオブジェクトが見つかった場合、Mixed Reality Toolkitにあるいくつかの高速シェーダとシェーダを交換することができます。また、複雑なオブジェクトをより少ない三角形のメッシュで単純化すれば、速度が向上します。
  • また、Unityはシェーダをコンパイルし、操作の呼び出し回数を表示することができ、相対速度を比較するのに役立ちます。これを確認するには、プロジェクトメニューのシェーダに移動し、インスペクタのメニューで[compile and show code]ボタンをクリックします。Visual Studioのウィンドウには、次のような統計情報が表示されます。

f:id:haikage1755:20170906195236p:plain

アプリ全体のパフォーマンスを向上させたら、同じツールを使用してアプリの適応的なクオリティとビューポートの調整を設定することができます。

Scene内でFPS Canvasを使用すると、適応的なクオリティとビューポートマネージャも取得できます。それを使用するには、ビューポートの倍率とクオリティ設定値を持つクオリティバケットのセットを事前に定義する必要があります。このセットは最も低いクオリティ設定(実行が最も速い)から最も高い設定(多くのCPUとGPUを消費する)までの順で並べる必要があります。バケットのセットは、AdaptiveQualityViewport.csの配列フィールドとしてハードコーディングされています。次のようなコードがあるはずです。

f:id:haikage1755:20170906200835p:plain

デフォルトでは、適応型クオリティマネージャは実行されていません。パブリックフィールドのAdaptiveQualityEnabledをtrueに設定することでオンにすることができます。Unityインスペクタから切り替えることもできます。デフォルトでは、クオリティマネージャは最低クオリティのバケットから開始します。マネージャが動作していなくても、AdaptiveQualityEnabledが有効になっている場合、クオリティとビューポートの設定が最低クオリティのバケットから自動的に設定されます。この動作は、startQvBucketフィールドを設定することで変更できます。Unityインスペクタから変更することもできます。選択する値は、qvBucketList配列の有効なインデックスでなければならないことに注意してください。適応マネージャが実行されると、1フレームのレンダリングに要した時間が分析されます。レンダリング時間がディスプレイのリフレッシュレートの許容フレーム時間に非常に近い(> 95%)か、またはそれ以上の場合、マネージャはクオリティとビューポートの設定を次に低いクオリティバケットに切り替えます。レンダリング時間がフレーム間で許容されるフレーム時間の75%よりも一貫して小さい場合、マネージャは次に高いクオリティのバケットに切り替えます。クオリティの切り替えの閾値は、スクリプトまたはUnityインスペクタで更新できます。

Windows Mixed Reality PCに関する考慮事項

Windows Mixed Reality PC (非Ultra PC)でパフォーマンス目標を達成するには、Unityのクオリティ設定を下げたり、デバイスのビューポートを減らす必要があります。これらの変更は視覚忠実度へ影響しますが、フレームレートが低いとユーザーに酔いを引き起こす可能性がありますので、ゲームを実行する要件として目標フレームレートを向上することを強くお勧めします。ゲームの視覚的な忠実度の低下がスペックの低いマシンで大きすぎると判断した場合は、スペックの低いユーザーにゲームを購入させないようにします。

スクリーンとQuadプレーンの読み込み

近日公開。

デフォルトのレンダリングターゲットサイズ

Windows Mixed Reality immersive headsetは中心視野内の画素密度を高くし、周辺部の画素密度を下げるために提示された画像を歪ませるレンズを内蔵しています。最高の視覚忠実度を得るために、我々はレンダリングターゲットのピクセル密度をレンズ領域の高密度のレンズエリアの中心に合わせて設定しています。このピクセル密度はレンダリングターゲット全体で一定であるため、ヘッドセットディスプレイよりも高い解像度になります。対照的に、他のVRプラットフォームではディスプレイのレンダリングサイズがデフォルトになることもあります。レンズのイメージの中央に正しいピクセル密度を得るためにはこのサイズを大きくする必要があります。つまりもしデフォルト設定を維持すると、アプリが他のVRプラットフォームと比較してより多くのピクセルを描画するかもしれません。これはパフォ-マンスを低下させますが視覚的忠実度は高くなります。他のプラットフォームで高いピクセル密度を達成するためにレンダリングスケールを増やす必要があることが判明した場合。おそらく追加の視覚忠実度を得ることができず、パフォーマンスが低下するためこのプラットフォームではそのロジックを削除する必要があります。

ダイナミック解像度スケーリング

ビューポートスケーリング(ダイナミック解像度スケーリング)は、イメージをデバイスが表示できるレンダリングターゲットより小さくレンダリングし、それらのピクセルからサンプリングして最終イメージを表示する方法です。これは視覚的忠実度と引き換えに速さを得ます。Windows Mixed Realityデバイスは、プラットフォームレベルでのビューポートスケーリングをサポートします。つまり、ビューポートを小さく設定すると(Unity:UnityEngine.XR.XRSettings.renderViewportScale = .7)、Unityはレンダリングターゲットの部分をより小さくレンダリングするようプラットフォームに通知し、プラットフォームはその表示をより小さなレンダリングターゲットの部分から表示を合成します。

MSAA

近日公開。

Windows Mixed Reality PCとUltra PCの検出

近日公開。

パフォーマンスツール

Unityパフォーマンスプロファイラ

Unityプロファイラは各Update関数でどれくらいの処理時間を要しているかを示すので、特にCPUがバインドされている場合は特に便利です。最も正確なパフォーマンス測定値は展開されたUWPアプリケーションのプロファイリングから得ることができます。ビルドされtUWPアプリをプロファイリングするには、開発者ビルドのチェックボックスが有効な状態でInternetClient capabilityを有効にしてビルドしてください。InternetClient capabilityを有効にするには、Edit > Project Settings > Playerを開き、Publisher Settingsを選択し、Capabilitiesの下にあるInternetClientをチェックしてください。パフォーマンスを改善する必要があるSceneが既に分かっている場合は、再生モードを使用して素早く反復することができ、UWPソリューションに比例した改善が見られる可能性があります。ボトルネックGPUにある場合でも、Unity Profilerから開始して、重要なプロセスを実行できます。例えば、Unity階層の全てのオブジェクトをオフにし、レンダリングに特に時間がかかるものを見つけるまで、それらを選択的にオンにすることによって、どのオブジェクトが最もレンダリングの問題を引き起こしているかを特定します。発見したら、オブジェクトを単純化するかまたはシェーダーのパフォーマンスを改善することができます。Mixed Reality Toolkitには、優れた高速なシェーダがいくつか用意されています。

Windows Device Portal

Windowsバイス・ポータルは、ネットワークまたはUSB接続を介してリモートでデバイスを設定し、管理することができます。また、Windowsバイスのリアルタイムパフォーマンスのトラブルシューティングや表示に役立つ高度な診断ツールも提供しています。

Intel Power Gadget

Intel® Power Gadgetはインテル®Core™プロセッサー(第2世代から第6世代のインテル®Core™プロセッサー)をサポートするソフトウェアベースの電力使用量監視ツールです(インテル®Atomプロセッサーはサポートしていない)。プロセッサー内のエネルギーカウンターを使用して、ワット数でのリアルタイムプロセッサーパッケージの電力情報をモニターおよび推定するアプリケーション、ドライバー、およびライブラリーが含まれています。

[研究者になりたかった青二才の戯言日記]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」