瞭解混合實境的效能

本文是瞭解Mixed Reality應用程式效能重要性的簡介。 如果您的應用程式未以最佳畫面播放速率執行,使用者體驗可能會大幅降低。 全像投影會顯示不穩定,且環境的前端追蹤不正確,導致使用者體驗不佳。 效能必須被視為混合實境開發的第一級功能,而不是一項完美的工作。

以下列出每個目標平臺的高效能畫面播放速率值。

平台 目標畫面播放速率
HoloLens 60 FPS
Windows Mixed Reality Ultra電腦 90 FPS
Windows Mixed Reality電腦 60 FPS

下列架構概述達到目標畫面播放速率的最佳做法。 如需在 Unity 環境中測量和改善畫面播放速率的秘訣,建議您閱讀 Unity 的效能建議一文

瞭解效能瓶頸

如果您的應用程式有效能不佳的畫面播放速率,第一個步驟是分析並瞭解應用程式在計算上密集的位置。 有兩個主要處理器負責轉譯場景的工作:CPU 和 GPU,每個處理器都會處理Mixed Reality應用程式的不同層面。 可能發生瓶頸的三個主要位置如下:

  1. 應用程式執行緒 - CPU - 負責您的應用程式邏輯,包括處理輸入、動畫、物理和其他應用程式邏輯。
  2. 轉譯執行緒 - CPU 到 GPU - 負責將繪製呼叫提交至 GPU。 當您的應用程式想要轉譯 Cube 或模型之類的物件時,此執行緒會將要求傳送至 GPU 來執行作業。
  3. GPU - 最常處理應用程式的圖形管線,以將 3D 資料 (模型、紋理等) 轉換成圖元。 最終會產生 2D 影像,以提交至裝置的畫面。

Lifetime of a Frame

一般而言,HoloLens應用程式會系結 GPU,但不一定是。 使用下列工具和技術來瞭解特定應用程式瓶頸的位置。

如何分析您的應用程式

有許多工具可讓您瞭解混合實境應用程式中的效能設定檔和潛在瓶頸。

以下是一些常見的工具,可協助您收集應用程式的深入分析資訊:

如何在任何環境中分析

判斷您的應用程式是否為 GPU 或 CPU 系結的其中一種方式,就是降低轉譯目標輸出的解析度。 藉由減少要計算的圖元數目,您將減少 GPU 負載。 裝置會轉譯為較小的紋理,然後向上取樣以顯示最終影像。

降低轉譯解析度之後,如果:

  1. 應用程式畫面播放速率 增加,然後您可能會 有 GPU 系結
  2. 應用程式畫面播放速率 未變更,然後您可能會 有 CPU 系結

注意

Unity 可讓您透過 XRSettings.renderViewportScale 屬性,輕鬆地在執行時間修改應用程式的轉譯目標解析。 裝置上呈現的最終影像具有固定解析度。 平臺會取樣較低的解析度輸出,以建置較高的解析度影像,以在顯示器上呈現。

UnityEngine.XR.XRSettings.renderScale = 0.7f;

如何改善您的應用程式

CPU 效能建議

一般而言,大部分在 CPU 上的混合實境應用程式中運作都牽涉到執行場景的「模擬」,以及處理您的應用程式邏輯。 下欄區域是以優化為目標:

  • 動畫
  • 物理特性
  • 記憶體配置
  • 複雜的演算法 (,例如反向 kinematics、路徑尋找)

GPU 效能建議

瞭解頻寬與填滿率

在 GPU 上轉譯框架時,應用程式會受到記憶體頻寬或填滿速率所系結。

  • 記憶體頻寬 是 GPU 可以從記憶體執行的讀取和寫入速率
    • 若要識別頻寬限制,請減少紋理品質,並檢查畫面播放速率是否已改善。
    • 若要識別填滿速率限制,請降低顯示器解析度,並查看畫面播放速率是否改善。

注意

如果您使用 Unity,請參閱我們的 Unity 特定 GPU 效能建議。 - 在 Unity 中,使用 XRSettings.renderViewportScale 屬性

記憶體頻寬通常涉及下列其中一項的優化:

  1. 較低的紋理解析度
  2. 使用較少的紋理 (法線、反射等)

填滿率著重于減少需要針對最終轉譯圖元計算的作業數目,包括:

  1. 要轉譯/處理的物件數目
  2. 每個著色器的作業數目
  3. 最終結果的 GPU 階段數目 (幾何著色器、後置處理效果等等)
  4. ) 轉譯 (顯示解析度的圖元數目

減少多邊形計數

較高的多邊形計數會產生更多 GPU 的作業,因此 減少場景中的多邊形數目 會減少轉譯時間。 還有其他因素會讓幾何網底變得昂貴,但多邊形計數是判斷轉譯場景所需花費多少工作的最簡單計量。

限制過度繪製

當多個物件被轉譯,但不會在螢幕上顯示,因為遮蔽物件隱藏這些物件時,就會發生高過度繪製。 Imagine查看其後方物件的牆。 所有幾何都會進行處理以進行轉譯,但只需要轉譯不透明牆,這會導致不必要的作業。

著色器

著色器是在 GPU 上執行的小型程式,並在轉譯時執行兩個重要步驟:

  1. 判斷應該繪製哪一個頂點,以及它們位於螢幕空間的位置, (頂點著色器)
    • 頂點著色器會針對每個網格執行每個頂點。
  2. (圖元著色器) 判斷每個圖元的色彩
    • 圖元著色器會依圖元執行,並由幾何轉譯為目標轉譯紋理。

一般而言,著色器會執行許多轉換和光源計算。 雖然複雜的光源模型、陰影和其他作業可能會產生絕佳的結果,但它們也隨附價格。 減少著色器中計算的作業數目,可以大幅減少每個畫面的 GPU 所需的工作。

著色器編碼建議
  • 盡可能使用雙線性篩選
  • 重新排列運算式,以使用 MAD 內建函式同時執行乘法和加法
  • 盡可能在 CPU 上預先計算,並將常數傳遞至材質
  • 偏好將作業從圖元著色器移至頂點著色器
    • 一般而言,頂點數目遠小於 720p (720p 為 921,600 圖元,1080p 為 2,073,600 圖元,依此類)

移除 GPU 階段

後續處理效果可能很昂貴,並增加應用程式的填滿率,包括 MSAA 之類的反別名技術。 在HoloLens上,我們建議避免這些技術和額外的著色器階段,例如幾何、殼層和計算著色器。

記憶體建議

過多的記憶體配置和解除配置作業可能會導致效能不一致、凍結畫面和其他有害行為。 在 Unity 中開發時,請務必瞭解記憶體考慮,因為記憶體管理是由垃圾收集行程所控制。

物件集區

物件共用是一種熱門的技術,可降低持續配置和解除配置物件的成本。 這是藉由配置相同物件的大型集區,並重複使用此集區中非使用中的可用實例來完成,而不是在一段時間內不斷產生和終結物件。 物件集區非常適合在應用程式期間有變數存留期的重複使用元件。

另請參閱