共用方式為


理解混合實境的效能

本文介紹效能對您的 Mixed Reality 應用程式的重要性。 如果你的應用程式無法以最佳幀率運行,使用者體驗可能會受影響。 全息影像看起來不穩定,頭部對環境的追蹤不準確,導致使用者體驗不佳。 把效能視為混合實境開發的一流特色,而非精緻的任務。

每個目標平台的效能幀率數值列於下表。

平台 目標幀率
全息鏡頭 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。 當你的應用程式想要渲染像立方體或模型這類物件時,這個執行緒會向 GPU 發送請求來執行這些操作。
  3. GPU - 最常負責處理應用程式的圖形管線,將 3D 資料 (模型、材質等) 轉換成像素。 它最終會產生一張 2D 影像,提交到你的裝置螢幕上。

框架壽命

一般來說,HoloLens 應用程式是受 GPU 限制的,但並非總是如此。 請運用以下章節的工具與技巧,了解您的應用程式在哪些方面處於瓶頸。

如何分析你的申請

有許多工具能幫助你了解混合實境應用中的效能配置與潛在瓶頸。

以下是一些常見工具,幫助你為申請蒐集深入的分析資訊:

如何在任何環境中進行側寫

判斷你的應用程式是受 GPU 還是 CPU 限制的一種方法是降低渲染目標輸出的解析度。 減少計算所需的像素數,就能減輕 GPU 負載。 裝置會先渲染成較小的貼圖,然後取樣上標顯示最終影像。

降低渲染解析度後,若:

  1. 應用程式幀率提升,那你很可能是 GPU 受限
  2. 應用程式幀率不變,那你很可能是 CPU 受限

注意事項

Unity 提供透過 XRSettings.renderViewportScale 屬性,在執行時輕鬆修改應用程式的渲染目標解析度的能力。 裝置上呈現的最終影像解析度固定。 平台會取樣較低解析度的輸出,以建立高解析度影像以供顯示器渲染。

UnityEngine.XR.XRSettings.renderScale = 0.7f;

如何改進你的申請

CPU 效能建議

一般來說,在 CPU 上的混合實境應用中,大多數工作都是進行場景的「模擬」並處理你的應用邏輯。 以下領域是針對優化的目標:

  • 動畫
  • 物理學
  • 記憶體配置
  • 複雜演算法 (,即反向運動學、路徑尋找)

GPU 效能建議

理解頻寬與填充率

在 GPU 上渲染畫面時,應用程式會受到記憶體頻寬或填充率的限制。

  • 記憶體頻寬 是指 GPU 從記憶體中讀取和寫入的速率
    • 為了找出頻寬限制,降低貼圖品質並檢查幀率是否改善。
    • 要找出填充率的限制,可以降低顯示解析度,看看幀率是否提升。

注意事項

如果你正在使用 Unity,請參考我們 針對 Unity 的 GPU 效能建議。 - 在 Unity 中,使用 XRSettings.renderViewportScale 屬性

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

  1. 較低的材質解析度
  2. 使用較少的貼圖 (法線、鏡面等,)

填充率著重於減少最終渲染像素所需計算的操作數量,包括:

  1. 要渲染/處理的物件數量
  2. 每個著色器可操作次數
  3. GPU 階段數到最終結果 (幾何著色器、後製效果等等)
  4. 顯示解析度下要渲染 (像素數)

減少多邊形數量

多邊形數量越多,GPU 需要操作越多,減少場景中多 邊形 數量就能縮短渲染時間。 還有其他因素會讓幾何體著色變得昂貴,但多邊形數量是判斷渲染場景所需工作量最簡單的指標。

限額超支

高超繪是指多個物件被渲染出來,但因為被遮蔽物體遮蔽而未顯示在螢幕上。 想像你看著一面牆後面有物品。 所有幾何體都會被處理來渲染,但只有不透明的牆面需要渲染,這會導致不必要的操作。

著色器

著色器是執行在 GPU 上的小型程式,並在渲染過程中執行兩個重要步驟:

  1. 頂點著色器 (決定應該繪製哪些頂點及其在螢幕空間中的位置)
    • 頂點著色器是針對每個網格每個頂點執行的。
  2. 像素著色器 (決定每個像素的顏色)
    • 像素著色器是逐像素執行,並由幾何體渲染到目標的渲染貼圖。

通常,著色器會做很多變換和光照計算。 雖然複雜的光影模型、陰影及其他操作能產生驚人的效果,但同時也伴隨著代價。 減少在著色器中計算的運算數量,可以大幅降低每幀 GPU 所需的工作量。

著色器編碼建議
  • 盡可能使用雙線性濾波
  • 重新排列表達式,使用MAD內在運算來同時進行乘法和加法
  • 盡可能在 CPU 上預先計算,並將常數傳遞給材料
  • 優先將操作從像素著色器移到頂點著色器
    • 一般來說,頂點數遠小於像素數 (720p為921,600像素,1080p為2,073,600像素,依此類推)

移除 GPU 階段

後製效果可能成本高昂,且會增加應用程式的填充率,包括像 MSAA 這類抗鋸齒技術。 在 HoloLens 上,我們建議避免這些技術,並避免使用額外的著色器階段,如幾何、船體和計算著色器。

記憶體建議

過度的記憶體配置與釋放操作可能導致效能不一致、幀凍結及其他不良行為。 在 Unity 開發時,了解記憶體考量尤其重要,因為記憶體管理是由垃圾回收器控制的。

物件池化

物件池是一種流行的技術,用以降低物件連續分配與釋放的成本。 這是透過分配大量相同物件,並重複利用這個物件池中未啟用的可用實例,而不是不斷地生成和摧毀物件來達成。 物件池對於在應用程式中壽命可變的可重複使用元件非常棒。

另請參閱