Share via


OpenXR 應用程式最佳做法

您可以在 BasicXrApp的 OpenXRProgram.cpp 檔案中看到下列最佳做法範例。 開頭的 Run () 函式會擷取一般的 OpenXR 應用程式程式碼流程,從初始化到事件和轉譯迴圈。

視覺品質與穩定性的最佳做法

本節中的最佳做法說明如何在任何 OpenXR 應用程式中取得最佳視覺品質與穩定性。

如需HoloLens 2專屬的進一步效能建議,請參閱下方HoloLens 2效能的最佳做法一節。

Gamma 正確的轉譯

請務必小心,以確保您的轉譯管線正確無誤。 轉譯至交換鏈時,轉譯目標檢視格式應該符合交換鏈格式。 例如, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB 針對交換鏈格式和轉譯目標檢視。 如果應用程式的轉譯管線在著色器程式碼中執行手動 sRGB 轉換,則發生例外狀況。 應用程式應該要求 sRGB 交換鏈格式,但針對轉譯目標檢視使用線性格式。 例如,要求 DXGI_FORMAT_B8G8R8A8_UNORM_SRGB 做為交換鏈格式,但使用 DXGI_FORMAT_B8G8R8A8_UNORM 做為轉譯目標檢視,以防止內容遭到雙 gamma 更正。

提交投影圖層的深度緩衝區

一律使用 XR_KHR_composition_layer_depth 延伸模組,並將深度緩衝區與投影層一起提交至 xrEndFrame 。 在HoloLens 2啟用硬體深度重現可改善全像投影穩定性。

選擇合理的深度範圍

偏好較窄的深度範圍來限定虛擬內容的範圍,以協助 HoloLens 上的全像投影穩定性。 例如,OpenXrProgram.cpp 範例使用 0.1 公尺到 20 公尺。 使用 reversed-Z 取得更統一的深度解析度。 在HoloLens 2上,使用慣 DXGI_FORMAT_D16_UNORM 用的深度格式有助於達到更好的畫面播放速率和效能,雖然 16 位深度緩衝區提供的深度解析度比 24 位深度緩衝區少。 遵循這些最佳做法,以充分利用深度解析度會變得更重要。

準備不同的環境混合模式

如果您的應用程式也會在完全封鎖全球的沉浸式頭戴式裝置上執行,請務必使用 xrEnumerateEnvironmentBlendModes API 列舉支援的環境混合模式,並正確準備您的轉譯內容。 例如,針對 HoloLens 之類的系統 XR_ENVIRONMENT_BLEND_MODE_ADDITIVE ,應用程式應該使用透明做為純色,而對於具有 XR_ENVIRONMENT_BLEND_MODE_OPAQUE 的系統而言,應用程式應該呈現一些不透明色彩或背景中的某些虛擬空間。

選擇未系結的參考空間作為應用程式的根空間

應用程式通常會建立一些根全局座標空間,以將檢視、動作和全像投影連接在一起。 XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT當支援延伸模組建立世界縮放座標系統時使用,讓您的 app 避免使用者遠 (遠距離 5 公尺的全像投影漂移,例如,從應用程式開始) 距離 5 公尺。 如果未系結的空間延伸模組不存在,請使用 XR_REFERENCE_SPACE_TYPE_LOCAL 做為後援。

建立全像投影與空間錨點的關聯

使用未系結的參考空間時,您直接放在該參考空間中的全像投影 可能會隨著使用者前往遠方會議室而漂移,然後返回。 若是全像投影使用者位於世界各地的離散位置,請使用 xrCreateSpatialAnchorSpaceMSFT 延伸模組函式建立空間錨點,並將全像投影置於其原點。 這樣可讓全像投影在一段時間內獨立穩定。

支援混合實境擷取

雖然HoloLens 2的主要顯示器使用加法環境混合,但當使用者開始混合實境擷取時,應用程式的轉譯內容將會與環境視訊串流混合。 若要在混合實境擷取影片中達到最佳視覺品質,最好是在投影層 的 layerFlags 中設定 XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT

HoloLens 2效能的最佳做法

作為具有硬體重現支援的行動裝置,HoloLens 2具有更嚴格的效能需求。 有數種方式可以透過提交組合資料,這會導致後續處理,並產生明顯的效能負面影響。

選取交換鏈格式

一律使用 xrEnumerateSwapchainFormats 列舉支援的像素格式,並從應用程式支援的執行時間選擇第一個色彩和深度像素格式,因為這是執行時間偏好的最佳效能。 請注意,在 HoloLens 2 上, DXGI_FORMAT_B8G8R8A8_UNORM_SRGB 通常是 DXGI_FORMAT_D16_UNORM 達到更佳轉譯效能的第一個選項。 在桌上型電腦上執行的 VR 頭戴裝置上,此喜好設定可能不同,其中 24 位深度緩衝區的效能影響較低。

效能警告: 使用主要交換鏈色彩格式以外的格式會導致執行時間後處理,這會產生顯著的效能負面影響。

一律使用建議的檢視組態寬度/高度轉譯 (recommendedImageRectWidthrecommendedImageRectHeight 和從 XrViewConfigurationView) ,並且一律使用 xrLocateViews API 來查詢建議的檢視姿勢、FOV 和其他轉譯參數,然後再轉譯。 查詢姿勢和檢視時,請一律使用 XrFrameEndInfo.predictedDisplayTime 來自最新 xrWaitFrame 呼叫的 。 這可讓 HoloLens 針對戴著 HoloLens 的人員調整轉譯和優化視覺品質。

使用單一投影層

HoloLens 2轉譯內容有有限的 GPU 電源,以及針對單一投影層優化的硬體撰寫器。 一律使用單一投影層可協助應用程式的畫面播放速率、全像投影穩定性和視覺品質。

效能警告: 提交單一保護層以外的任何專案會導致執行時間後置處理,這會產生顯著的效能負面影響。

使用紋理陣列和 VPRT 轉譯

針對色彩交換鏈使用 arraySize=2 ,針對左眼和右眼建立一個 xrSwapchain ,另一個用於深度。 將左眼轉譯為配量 0,並將右眼轉譯為配量 1。 使用著色器搭配 VPRT 和實例繪製呼叫,以進行立體轉譯,以將 GPU 負載降到最低。 這也可讓執行時間的優化達到HoloLens 2的最佳效能。 使用紋理陣列的替代方法,例如雙寬轉譯或每個眼睛的個別交換鏈,會導致執行時間後處理,這會產生顯著的效能負面影響。

避免四層

不要使用 將四層提交為組合層 XrCompositionLayerQuad ,而是直接將四邊形內容轉譯成投影交換鏈。

效能警告: 提供超過單一投影層的額外圖層,例如四層層,將會導致執行時間後處理,這會產生顯著的效能負面影響。