本文介紹效能對您的 Mixed Reality 應用程式的重要性。 如果你的應用程式無法以最佳幀率運行,使用者體驗可能會受影響。 全息影像看起來不穩定,頭部對環境的追蹤不準確,導致使用者體驗不佳。 把效能視為混合實境開發的一流特色,而非精緻的任務。
每個目標平台的效能幀率數值列於下表。
| 平台 | 目標幀率 |
|---|---|
| 全息鏡頭 | 60 FPS |
| Windows Mixed Reality Ultra 電腦 | 90 FPS |
| Windows Mixed Reality 電腦 | 60 FPS |
以下框架概述了達成目標幀率的最佳實務。 關於測量與提升 Unity 環境中幀率的技巧,請參閱 Unity 的效能建議文章。
了解效能瓶頸
如果你的應用程式幀率不佳,第一步是分析並了解應用程式計算密集的區域。 兩個主要處理器負責渲染場景的工作:CPU 和 GPU。 每個處理器負責你的 Mixed Reality 應用程式的不同面向。 瓶頸可能出現的三個關鍵地點為:
- 應用程式執行緒 - CPU - 負責你的應用程式邏輯,包括處理輸入、動畫、物理及其他應用程式邏輯。
- 渲染執行緒 - CPU 對 GPU - 負責將繪製呼叫提交給 GPU。 當你的應用程式想要渲染像立方體或模型這類物件時,這個執行緒會向 GPU 發送請求來執行這些操作。
- GPU - 最常負責處理應用程式的圖形管線,將 3D 資料 (模型、材質等) 轉換成像素。 它最終會產生一張 2D 影像,提交到你的裝置螢幕上。
一般來說,HoloLens 應用程式是受 GPU 限制的,但並非總是如此。 請運用以下章節的工具與技巧,了解您的應用程式在哪些方面處於瓶頸。
如何分析你的申請
有許多工具能幫助你了解混合實境應用中的效能配置與潛在瓶頸。
以下是一些常見工具,幫助你為申請蒐集深入的分析資訊:
如何在任何環境中進行側寫
判斷你的應用程式是受 GPU 還是 CPU 限制的一種方法是降低渲染目標輸出的解析度。 減少計算所需的像素數,就能減輕 GPU 負載。 裝置會先渲染成較小的貼圖,然後取樣上標顯示最終影像。
降低渲染解析度後,若:
- 應用程式幀率提升,那你很可能是 GPU 受限
- 應用程式幀率不變,那你很可能是 CPU 受限了
注意事項
Unity 提供透過 XRSettings.renderViewportScale 屬性,在執行時輕鬆修改應用程式的渲染目標解析度的能力。 裝置上呈現的最終影像解析度固定。 平台會取樣較低解析度的輸出,以建立高解析度影像以供顯示器渲染。
UnityEngine.XR.XRSettings.renderScale = 0.7f;
如何改進你的申請
CPU 效能建議
一般來說,在 CPU 上的混合實境應用中,大多數工作都是進行場景的「模擬」並處理你的應用邏輯。 以下領域是針對優化的目標:
- 動畫
- 物理學
- 記憶體配置
- 複雜演算法 (,即反向運動學、路徑尋找)
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 開發時,了解記憶體考量尤其重要,因為記憶體管理是由垃圾回收器控制的。
物件池化
物件池是一種流行的技術,用以降低物件連續分配與釋放的成本。 這是透過分配大量相同物件,並重複利用這個物件池中未啟用的可用實例,而不是不斷地生成和摧毀物件來達成。 物件池對於在應用程式中壽命可變的可重複使用元件非常棒。