複合現実のパフォーマンスを理解するUnderstanding performance for mixed reality

この記事では、Mixed Reality アプリのパフォーマンスの重要性について説明します。This article is an introduction to understanding the significance of performance for your Mixed Reality app. アプリケーションが最適なフレームレートで実行されない場合、ユーザーエクスペリエンスが大幅に低下する可能性があります。User experience can be greatly degraded if your application does not run at optimal frame rate. ホログラムが不安定になり、環境のヘッドトラッキングが不正確になり、ユーザーのエクスペリエンスが低下します。Holograms will appear unstable and head tracking of the environment will be inaccurate, leading to a poor experience for the user. パフォーマンスは、ポーランド語のタスクではなく、混合現実の開発のためのファーストクラスの機能と考える必要があります。Performance must be considered a first class feature for mixed reality development and not a polish task.

各ターゲットプラットフォームのパフォーマンスフレームの値の一覧を次に示します。The performant framerate values for each target platform are listed below.

プラットフォームPlatform ターゲットフレームレートTarget Frame Rate
HoloLensHoloLens 60 FPS60 FPS
Windows Mixed Reality ウルトラ PcWindows Mixed Reality Ultra PCs 90 FPS90 FPS
Windows Mixed Reality PcWindows Mixed Reality PCs 60 FPS60 FPS

次のフレームワークでは、ターゲットフレームレートに到達するためのベストプラクティスについて概説します。The framework below outlines best practices for hitting target frame rates. Unity で開発する場合は、unity 環境でのフレームレートの測定と向上に関するヒントについては、 unity のパフォーマンスに関する推奨事項に関する記事を参照してください。If developing in Unity, consider reading the performance recommendations for Unity article for tips on measuring and improving framerate in the Unity environment.

パフォーマンスのボトルネックについてUnderstanding performance bottlenecks

アプリの不採算事業フレームレートがある場合、最初の手順は、アプリケーションが計算を集中的に使用している場所を分析して理解することです。If your app has an underperforming framerate, the first step is to analyze and understand where your application is computationally intensive. シーンをレンダリングする作業には、CPU と GPU の2つの主要なプロセッサがあります。There are two primary processors responsible for the work to render your scene: the CPU and the GPU. これらはそれぞれ、混合 Reality アプリのさまざまな側面を処理します。Each of these handle different aspects of your Mixed Reality app. ボトルネックが発生する可能性がある主な場所には、次の3つがあります。There are three key places where bottlenecks may occur:

  1. アプリスレッド-CPU -このスレッドは、アプリロジックを担います。App Thread - CPU - This thread is responsible for your app logic. これには、入力、アニメーション、物理、およびその他のアプリロジックの処理が含まれます。This includes processing input, animations, physics, and other app logic.
  2. スレッドを gpu にレンダリングする-このスレッドは、gpu への描画呼び出しを送信します。Render Thread - CPU to GPU - This thread is responsible for submitting your draw calls to the GPU. アプリでキューブやモデルなどのオブジェクトをレンダリングする場合、このスレッドは GPU に要求を送信してこれらの操作を実行します。When your app wants to render an object such as a cube or model, this thread sends a request to the GPU to perform these operations.
  3. GPU -このプロセッサは、通常、3d データ (モデル、テクスチャなど) をピクセルに変換するために、アプリケーションのグラフィックスパイプラインを処理します。GPU - This processor most commonly handles the graphics pipeline of your application to transform 3D data (models, textures, etc.) into pixels. 最終的には、デバイスの画面に送信する2D イメージが生成されます。It ultimately produces a 2D image to submit to your device's screen.

フレームの有効期間

一般に、HoloLens アプリケーションは GPU にバインドされますが、常にではありません。Generally, HoloLens applications will be GPU bound, but not always. 以下のツールと手法を使用して、特定のアプリがボトルネックになっている場所を把握してください。Use the tools and techniques below to understand where your particular app is bottlenecked.

アプリケーションを分析する方法How to analyze your application

混合現実アプリケーションのパフォーマンスプロファイルを理解できるツールは多数あります。There are many tools that allow you to understand the performance profile of your mixed reality application. これらを使用すると、ボトルネックがある場所と理由を見つけることができるため、対処できます。These will enable you to find where and why you have bottlenecks, so you can address them.

アプリケーションの詳細なプロファイル情報を取得するための一般的なツールを次に示します。Below are some common tools to gain deep profiling information for your application:

任意の環境でプロファイリングする方法How to profile in any environment

アプリケーションで GPU バインドと CPU バインドのどちらを使用しているかを判断する方法の1つは、レンダーターゲットの出力の解像度を下げることです。One way to determine if you are GPU bound or CPU bound in your application is to decrease the resolution of the render target output. 計算するピクセル数を減らすことにより、GPU の負荷が軽減されます。By reducing the number of pixels to calculate, this will reduce your GPU load. デバイスは、小さいテクスチャにレンダリングされ、その後、最後のイメージを表示するためにアップサンプリングされます。The device will render to a smaller texture, then up-sample to display your final image.

レンダリングの解像度を下げると、次のようになります。After decreasing rendering resolution, if:

  1. アプリケーションのフレームレートが増加し、 GPU にバインドされている可能性があります。Application framerate increases, then you are likely GPU Bound
  2. アプリケーションのフレームレートが変更されていないため、 CPU バインドされている可能性がありますApplication framerate unchanged, then you are likely CPU Bound

注意

Unity では、 XRSettings プロパティを使用して、実行時にアプリケーションのレンダーターゲットの解像度を簡単に変更することができます。Unity provides the ability to easily modify the render target resolution of your application at runtime through the XRSettings.renderViewportScale property. デバイスに表示される最終的なイメージには、固定された解決策があります。The final image presented on device has a fixed resolution. このプラットフォームでは、解像度の低い出力をサンプリングして、ディスプレイに表示する解像度の高いイメージを構築します。The platform will sample the lower resolution output to build a higher resolution image for rendering on displays.

UnityEngine.XR.XRSettings.renderScale = 0.7f;

アプリケーションを改善する方法How to improve your application

CPU パフォーマンスに関する推奨事項CPU performance recommendations

一般に、CPU 上の mixed reality アプリケーションでほとんどの作業を行うには、シーンの "シミュレーション" を実行し、アプリケーションロジックを処理する必要があります。Generally, most work in a mixed reality application on the CPU involves performing the "simulation" of the scene and processing your application logic. 通常、最適化の対象となる領域は次のとおりです。The following areas are usually targeted for optimization:

  • アニメーションAnimations
  • 物理Physics
  • メモリの割り当てMemory allocations
  • 複雑なアルゴリズム (Complex algorithms (i.e 逆のキネマティック、パスの検索)inverse kinematics, path-finding)

GPU のパフォーマンスに関する推奨事項GPU performance recommendations

帯域幅とフィルレートを理解するUnderstanding bandwidth vs. fill rate

GPU でフレームをレンダリングする場合、通常、アプリケーションはメモリ帯域幅またはフィルレートによって制限されます。When rendering a frame on the GPU, an application is generally either bound by memory bandwidth or fill rate.

  • メモリ帯域幅は、GPU がメモリから実行できる読み取りと書き込みの比率です。Memory bandwidth is the rate of reads and writes the GPU can perform from memory
    • 帯域幅の制限を特定するには、テクスチャの品質を下げ、フレームレートが改善されたかどうかを確認します。To identify bandwidth limitations, reduce texture quality and check if the framerate has improved.
    • Unity では、[ Edit Texture Quality > プロジェクト設定の > 品質設定 の編集] で [テクスチャの品質] を変更することによってこれを行うことができます。In Unity, this can be done by changing Texture Quality in Edit > Project Settings > Quality Settings.
  • Fill rateは、GPU によって1秒あたりに描画できるピクセルを表します。Fill rate refers to the pixels that can be drawn per second by the GPU.
    • フィルレートの制限を特定するには、ディスプレイの解像度を下げ、フレームレートが改善されたかどうかを確認します。To identify fill rate limitations, decrease the display resolution and check if framerate improved.
    • Unity では、XRSettings プロパティを使用してこれを行うことができ*ます。*In Unity, this can be done via the XRSettings.renderViewportScale property

通常、メモリ帯域幅には次のいずれかの最適化が伴います。Memory bandwidth generally involves optimizations to either:

  1. テクスチャ解像度を下げるDecrease texture resolutions
  2. 使用するテクスチャ (法線、反射など) を減らすUtilize fewer textures (normals, specular, etc.)

Fill rate は、レンダリングされた最終的なピクセルに対して計算する必要がある操作の数を減らすことに焦点を合わせています。Fill rate is focused on reducing the number of operations that need to be computed for a final rendered pixel. これには、次の制限が含まれます。This includes reducing:

  1. 表示/処理するオブジェクトの数Number of objects to render/process
  2. シェーダーあたりの操作数Number of operations per shader
  3. 最終結果に対する GPU ステージの数 (ジオメトリシェーダー、処理後の影響など)Number of GPU stages to final result (geometry shaders, post-processing effects, etc.)
  4. レンダリングするピクセル数 (表示解像度)Number of pixels to render (display resolution)

多角形の数を減らすReduce polygon count

ポリゴンの数が多いほど、GPU に対する操作が増えることになります。シーンの多角形の数を減らすと、レンダリング時間が短縮されます。Higher polygon counts result in more operations for the GPU; reducing the number of polygons in your scene will reduce the render time. コストがかかる可能性のあるジオメトリの網掛けに関連する要因は他にもありますが、polygon count は、シーンがどの程度高価にレンダリングされるかを判断するための最も簡単なメトリックです。There are other factors involved in shading the geometry that can be expensive, but polygon count is the simplest metric to determine how expensive a scene will be to render.

オーバードローを制限するLimit overdraw

Occluding オブジェクトによって非表示になっているため、複数のオブジェクトがレンダリングされても画面に表示されない場合は、高いオーバードローが発生します。High overdraw occurs when multiple objects are rendered but not shown on screen as they are hidden by an occluding object. その背後にオブジェクトがある壁を見てみましょう。Imagine looking at a wall that has objects behind it. すべてのジオメトリはレンダリングのために処理されますが、不透明な壁面だけをレンダリングする必要があります。All of the geometry would be processed for rendering, but only the opaque wall needs to be rendered. この結果、不要な操作が発生します。This results in unnecessary operations.

シェーダーShaders

シェーダーは、GPU 上で実行され、レンダリングの2つの重要な手順を実行する小さなプログラムです。Shaders are small programs that run on the GPU and perform two important steps in rendering:

  1. 描画する頂点と画面空間内の位置を決定する (頂点シェーダー)Determining which vertices should be drawn and where they are in screen space (the Vertex shader)
    • 頂点シェーダーは、通常、各メッシュの頂点ごとに実行されます。The Vertex shader is generally executed per vertex for every mesh.
  2. 各ピクセルの色を決定する (ピクセルシェーダー)Determining the color of each pixel (the Pixel shader)
    • ピクセルシェーダーは、描画されるテクスチャに対してジオメトリによってレンダリングされるピクセルごとに実行されます。The Pixel shader is executed per pixel rendered by the geometry to the texture being rendered to.

通常、シェーダーでは、多くの変換と照明計算が実行されます。Typically, shaders perform many transformations and lighting calculations. 複雑な照明モデル、影、およびその他の操作によって、優れた結果が得られる場合もありますが、価格もあります。Although complex lighting models, shadows, and other operations can generate fantastic results, they also come with a price. シェーダーで計算される操作の数を減らすと、フレームあたりの GPU に必要な作業が大幅に減少します。Reducing the number of operations computed in shaders can greatly reduce the work needed for the GPU per frame.

シェーダーのコーディングに関する推奨事項Shader coding recommendations
  • 可能な限り、バイリニアフィルタリングを使用するUse bilinear filtering, whenever possible
  • 同時に乗算と加算を行うために、MAD 組み込みを使用するように式を再配置します。Rearrange expressions to use MAD intrinsics in order to do a multiply and an add at the same time
  • CPU で可能な限り Precalculate し、素材に定数として渡します。Precalculate as much as possible on the CPU and pass as constants to the material
  • ピクセルシェーダーから頂点シェーダーへの移動操作を優先するFavor moving operations from the pixel shader to the vertex shader
    • 一般に、頂点の数は、ピクセル数よりもはるかに小さくなっています (720p は921600ピクセル、1080p は2073600ピクセル、など)。Generally, the number of vertices is much smaller than the number of pixels (720p is 921,600 pixels, 1080p is 2,073,600 pixels, etc.)

GPU ステージの削除Remove GPU stages

処理後の影響は非常に高額であり、アプリケーションの塗りつぶしレートが高くなる可能性があります。Post-processing effects can be very expensive and increase the fill rate of your application. これには、MSAA などのアンチエイリアシング技法が含まれます。This includes anti-aliasing techniques such as MSAA. HoloLens では、これらの手法を完全に回避することをお勧めします。また、geometry、ハル、compute シェーダーなどの追加のシェーダーステージを回避することをお勧めします。On HoloLens, it is recommended to avoid these techniques entirely, as well as additional shader stages such as geometry, hull, and compute shaders.

メモリに関する推奨事項Memory recommendations

過剰なメモリの割り当ておよび解放操作を行うと、パフォーマンスが低下したり、フレームがフリーズしたり、その他の有害な動作が発生したりする可能性があります。Excessive memory allocation and deallocation operations can result in inconsistent performance, frozen frames, and other detrimental behavior. メモリ管理はガベージコレクターによって制御されるため、Unity で開発するときは、メモリに関する考慮事項を理解することが特に重要です。It is especially important to understand memory considerations when developing in Unity, since memory management is controlled by the garbage collector.

オブジェクトプールObject pooling

オブジェクトプールは、オブジェクトの継続的な割り当てと割り当て解除のコストを削減するための一般的な手法です。Object pooling is a popular technique to reduce the cost of continuous allocations and deallocations of objects. これを行うには、同一のオブジェクトの大規模なプールを割り当て、時間の経過と共にオブジェクトを絶えず破棄するのではなく、このプールから使用可能な非アクティブなインスタンスを再利用します。This is done by allocating a large pool of identical objects and re-using inactive, available instances from this pool instead of constantly spawning and destroying objects over time. オブジェクトプールは、アプリの有効期間が可変の再使用可能なコンポーネントに最適です。Object pools are great for re-useable components that have variable lifetime during an app.

関連項目See also