瞭解混合實境的效能
本文是瞭解Mixed Reality應用程式效能重要性的簡介。 如果您的應用程式未以最佳畫面播放速率執行,使用者體驗可能會大幅降低。 全像投影會出現不穩定,且環境的頭部追蹤會不正確,導致使用者體驗不佳。 效能必須被視為混合實境開發的第一類功能,而不是波蘭的工作。
每個目標平臺的效能畫面播放速率值如下所列。
平台 | 目標畫面播放速率 |
---|---|
HoloLens | 60 FPS |
Windows Mixed Reality Ultra電腦 | 90 FPS |
Windows Mixed Reality電腦 | 60 FPS |
下列架構概述達到目標畫面播放速率的最佳做法。 如需在 Unity 環境中測量和改善畫面播放速率的秘訣,建議您閱讀 Unity 的效能建議一文
瞭解效能瓶頸
如果您的應用程式具有效能不佳的畫面播放速率,第一個步驟是分析並瞭解應用程式在計算上密集的位置。 有兩個主要處理器負責轉譯場景:CPU 和 GPU,每個處理Mixed Reality應用程式的不同層面。 可能發生瓶頸的三個主要位置如下:
- 應用程式執行緒 - CPU - 負責您的應用程式邏輯,包括處理輸入、動畫、物理和其他應用程式邏輯。
- 轉譯執行緒 - CPU 到 GPU - 負責將繪圖呼叫提交至 GPU。 當您的應用程式想要轉譯 Cube 或模型之類的物件時,此執行緒會將要求傳送至 GPU 來執行作業。
- GPU - 最常處理應用程式的圖形管線,以將 3D 資料轉換成圖元 (模型、紋理) 等等。 最終會產生 2D 影像以提交至裝置的畫面。
一般而言,HoloLens 應用程式會系結 GPU,但不一定。 使用下列工具和技術來瞭解特定應用程式瓶頸的位置。
如何分析您的應用程式
有許多工具可讓您瞭解混合實境應用程式中的效能設定檔和潛在瓶頸。
以下是一些常見的工具,可協助您收集應用程式的深入分析資訊:
如何在任何環境中分析
判斷您的應用程式是否為 GPU 或 CPU 系結的其中一種方式是降低轉譯目標輸出的解析度。 藉由減少要計算的圖元數目,您將減少 GPU 負載。 裝置會轉譯為較小的紋理,然後向上取樣以顯示最終影像。
降低轉譯解析度之後,如果:
- 應用程式畫面播放速率 增加,然後您可能會 系結 GPU
- 應用程式畫面播放速率 未變更,然後您可能會 有 CPU 系結
注意
Unity 可讓您透過 XRSettings.renderViewportScale 屬性,輕鬆地在執行時間修改應用程式的轉譯目標解析度。 裝置上呈現的最終影像具有固定解析度。 平臺會取樣較低的解析度輸出,以在顯示器上建置更高解析度的影像來呈現。
UnityEngine.XR.XRSettings.renderScale = 0.7f;
如何改善您的應用程式
CPU 效能建議
一般而言,在 CPU 上的混合實境應用程式中大部分工作都牽涉到執行場景的「模擬」,以及處理您的應用程式邏輯。 下欄區域是以優化為目標:
- 動畫
- 物理特性
- 記憶體配置
- 複雜演算法 (例如反向 kinematics、路徑尋找)
GPU 效能建議
瞭解頻寬與填滿率
在 GPU 上轉譯畫面格時,應用程式會受到記憶體頻寬或填滿速率的系結。
- 記憶體頻寬 是讀取和寫入 GPU 可從記憶體執行的速率
- 若要識別頻寬限制,請減少紋理品質,並檢查框架速率是否已改善。
- 若要識別填滿速率限制,請降低顯示器解析度,並查看畫面播放速率是否改善。
注意
如果您使用 Unity,請參閱我們的 Unity 特定 GPU 效能建議。 - 在 Unity 中,使用 XRSettings.renderViewportScale 屬性
記憶體頻寬通常涉及下列其中一項的優化:
- 較低的紋理解析度
- 使用較少的紋理 (常態、反射等)
填滿率著重于減少需要針對最終轉譯圖元計算的作業數目,包括:
- 要轉譯/處理的物件數目
- 每個著色器的作業數目
- 最終結果的 GPU 階段數目 (幾何著色器、後置處理效果等等)
- 要轉譯的圖元數 (顯示解析度)
減少多邊形計數
較高的多邊形計數會導致 GPU 的更多作業,因此 減少場景中的多邊形數目會減少 轉譯時間。 還有其他因素造成幾何陰影成本很高,但多邊形計數是判斷呈現場景所需花費多少工時最簡單的計量。
限制過度繪製
當多個物件轉譯但未在畫面上顯示,因為遮蔽物件隱藏這些物件時,就會發生高過度繪製。 想像一下有物件後方的牆。 所有幾何都會處理轉譯,但只需要轉譯不透明牆,這會導致不必要的作業。
著色器
著色器是在 GPU 上執行的小型程式,並在轉譯時執行兩個重要步驟:
- 判斷應該繪製的頂點,以及它們位於螢幕空間的位置, (頂點著色器)
- 頂點著色器會針對每個網格執行每個頂點。
- (圖元著色器) 判斷每個圖元的色彩
- 圖元著色器會依圖元執行,並由幾何轉譯為目標轉譯紋理。
著色器通常會進行許多轉換和光源計算。 雖然複雜的光源模型、陰影和其他作業可能會產生絕佳的結果,但它們也會有價格。 減少著色器中計算的作業數目,可大幅減少每個畫面的 GPU 所需的工作。
著色器編碼建議
- 盡可能使用雙向篩選
- 重新排列運算式以使用 MAD 內建函式同時執行乘法和加法
- 盡可能在 CPU 上預先計算,並將常數傳遞至材質
- 偏好將作業從圖元著色器移至頂點著色器
- 一般而言,頂點數目遠小於 720p 的圖元數目, (921,600 圖元,1080p 為 2,073,600 圖元,依此類)
移除 GPU 階段
後置處理效果可能很昂貴,並增加應用程式的填滿率,包括 MSAA 之類的反別名技術。 在 HoloLens 上,我們建議避免這些技術和額外的著色器階段,例如幾何、殼層和計算著色器。
記憶體建議
過多的記憶體配置和解除配置作業可能會導致效能不一致、凍結畫面和其他有害行為。 在 Unity 中開發時,請務必瞭解記憶體考慮,因為記憶體管理是由垃圾收集行程所控制。
物件集區
物件共用是一種熱門的技術,可降低持續配置和解除配置物件的成本。 這是藉由配置相同物件的大型集區,並重複使用此集區中非使用中的可用實例來完成,而不是在一段時間內不斷產生和終結物件。 物件集區非常適合在應用程式期間有變數存留期的重複使用元件。