1. 程式人生 > >HoloLens開發與性能優化實踐

HoloLens開發與性能優化實踐

visual 應用開發 啟動速度 腳本優化 效果 perf 獲得 屬於 性能

HoloLens中國版終於於5月底在中國上市,同時國內的技術社區經過一年的成長也有了很大的擴張,越來越多的開發者開始進入了HoloLens開發領域,嘗試著使用混合現實(Mixed Reality)技術來構建屬於未來的創新應用。

HoloLens開發回顧


HoloLens2016年初正式開始發貨,筆者有幸能夠拿到第一波上市設備,當時大多流入國內的方式還是通過人肉搬運。當時的HoloLens開發在全球範圍內都處於起步階段,可以利用的開發資源只有官方文檔等少數內容,然而今天則非常豐富,下面我們來看這一年來的變化。

  • 開發工具鏈

目前的HoloLens開發方式有兩種,分別為使用Unity3D

引擎開發,和使用DirectX 11原生開發。Unity3D引擎開發是目前最為推薦的開發方式,具有完善的工具鏈支持,開發的難度較低,圖形化的可視場景編輯器也使得構建全息場景的效率更高.同時,使用C++DirectX也可以開發HoloLens全息場景,並可用來編寫中間件。如果偏愛C#的話,借助SharpDX開源庫,C#也可以使用DirectX來進行開發。

HoloLens搭載的系統Windows Holographic更名為Windows Mixed Reality,最新版本功能上更為完善。

Unity3D工具最新版本為2017.1.0f3,與HoloLens的集成度更高,內置了Holographic

仿真器,可以在試圖編輯器中仿真Spatial Mapping功能,引入最新的Video Player組件,可以使用GPU硬件加速來使得全景視頻可以在HoloLens上流暢播放。

技術分享

1 空間映射仿真器

Visual Studio最新可用版本為2017,免費的社區版功能仍然可以滿足HoloLens開發需求,配合Visual Studio Tools for Unity插件可以很方便進行調試編譯。

  • 第三方庫

Vuforia SDK是高通開發的AR識別庫,目前最新版本為v6.2.x,對HoloLens已有較好的支持,所以我們可以在Unity項目中使用它實現對圖像目標(ImageTarget

)和標記(VuMaker)的實時追蹤,讓應用具有更好的混合現實體驗。使用前需要去註冊Vuforia訂閱,免費版有API調用次數限制,若想使用更多調用,則需要註冊付費訂閱。

技術分享

2 集成Vuforia SDK

HoloToolkit項目從HoloLens發貨之初就開始出現,早期提供了一些對核心開發特性的封裝,包括Gazure、手勢識別、語音識別、空間映像等等。經過一年多的發展,小區開發者們貢獻了大量的新代碼,功能有了大幅提高。其中後來出現的Spatial Understand組件使得我們可以方便的分析Spatial Mapping的空間表面數據,快速的識別不同空間表面的特性,比如墻壁在哪裏,地面在哪裏。基於它可以實現像微軟官方App那樣的高質量的空間映射效果。

技術分享

3 空間映射最佳實踐

HoloLensCompanionKit項目提供了一系列HoloLens的配套工具,雖然不直接運行在HoloLens上,但卻能給用戶體驗帶來極大的補充,目前主要分為Holographic Remoting HostKinectIPDMixedRemoteViewCompositorSpectatorViewWindows Mixed Reality Commander 5個組件。其中,Holographic Remoting Host提供了一個示例UWP項目可以將HoloLens上的視圖內容在PC或其他UWP設備上串流顯示;KinectIPD可以使用Kinect自動測量並為HoloLens設置用戶瞳距,精度為+/-2毫米,適用於多人共享一臺HoloLens設備的場景,比如做Demo時。MixedRemoteViewCompositor可以讓用戶查看HoloLens接近實時的視野內容,基於HoloLens內置的混合捕獲功能(Mixed Reality Capture)。SpectatorView提供了一組軟硬件方案,使得我們可以搭建一套高分辨率的HoloLens實時混合補貨硬件,安裝於HoloLens上的外部相機可以提供第三方視角的內容,可以獲得更高質量的視頻和圖片內容。Windows Mixed Reality Commander是一個UWP應用,演示了如何通過Windows Device Portal API在教室或Demo環境下管理多臺HoloLensPC設備,可以實現對設備的有效的控制管理。

技術分享

4 HoloLen SpectorView硬件平臺

HoloLens with ARToolkit項目是基於著名的ARToolkit項目對HoloLens做了適配,使得HoloLens也可以使用上高效的AR追蹤體驗,可以追蹤的目標包括單個標記(Single Marker)、立方體標記(Cube Marker)和多個標記(Multi Marker,最新版v 0.2在常規渲染模式下可以達到45-60fps,在標記追蹤模式下可以達到25-30fps的幀速率,效果相當不錯。

技術分享

5 HoloLens with ARToolkit

性能優化


正如我們所知道,HoloLens是一款移動計算設備,在保證續航能力的前提下,意味著HoloLens不會具有特別強勁的計算能力,所以性能優化就變得至關重要了。

對於全息場景而言,我們需要權衡圖形復雜度、渲染幀速率、渲染延遲、輸入延遲、功耗和電池壽命等內容來確保能提供給客戶理想的體驗。事實上,有三個關鍵指標需要我們盡可能的滿足:

指標

目標

幀速率

60fps

功耗

一分鐘內平均功耗處於HoloLens Device Portal性能工具圖標中的橙色和綠色區域。如圖9Power部分

內存

總提交內存小於900M

HoloLen開發應用與開發傳統桌面應用是完全不同的,因為用戶會在物理世界中移動,所以為了使得全息圖像能有逼真的體驗,必須快速的刷新用戶視圖。用戶每只眼睛看到的視圖是不同的,所以我們必須在能模擬物理法則的情況下,以最低的延遲來刷新用戶視野,避免全息圖形相對真實世界發生漂移。全息場景的渲染管道和第一人稱視角的3D遊戲的渲染管道是相似的,60fpsHoloLens也是理想的指標,當應用的幀速率接近或達到60fps時,實時低延遲的渲染會讓全息場景會達到最佳的視覺體驗,看起來會更接近很真實物體。

在應用開發周期中,60fps的目標是我們應該最先努力達成,只有在滿足幀速率後,才應當去考慮功耗的優化。而且當畫面的幀速率遠低於60fps時,此時測出的功耗會有較大的誤差。

性能優化建議:

  • 視圖復雜度

全息應用和其他圖形應用一樣,視圖的復雜度會嚴重影響渲染性能,因此為了盡可能達到60fps,我們首先關註的應該是對視圖復雜度的優化。對於HoloLens而言,視圖復雜度的優化應當關註以下方面:

    1)模型面數

場景中的3D模型的面數越多,雖然在視覺效果上會越精細越動人,但也意味著會消耗更多的計算和存儲資源,對設備的負擔越大。當場景中模型的面數過多時,會導致幀速率大幅降低,用戶會明顯感到畫面出現延遲、卡頓,這對於全息場景而言是致命的。在這種情況下,在保證觀看效果的情況下,模型的面數越少越好。從我個人的實踐經驗來看,整個場景中,總渲染面數應當控制在10-20萬以內。

技術分享

6 面數較低的模型效果

    2)著色器Shader

Shader對於圖形渲染是至關重要的組件,在HoloLens上也是我們優化的重點。一般來講,工具生成的通用shader一般太過復雜,很多內容對HoloLens無用,因此我們可以使用高階著色器語言(HLSL)來自己編寫shader,提高視圖的渲染效率。Unity3D自帶的shader不被推薦使用,取而代之的是推薦使用HoloToolkit-Unity項目中的經過精簡優化的shader

此外,切換shader渲染不同的全息圖像對性能的代價非常大,推薦應當對Draw Call進行排序,使得能順序渲染具有同一著色器的對象,減少切換shader的次數,提高渲染效率。

技術分享

7 HoloToolkit中優化後的Shader

    3)紋理

場景中使用的紋理應該盡可能使用bilinear雙線性過濾模式,可以保證相對平滑的視圖過渡效果,這也是Unity3D默認設置,同時慎用trilinear三線性模式,它會降低渲染速度。同時紋理壓縮應當盡可能使用DXT壓縮並啟用MipMap,實現對顯存帶寬的優化,優化GPU瓶頸。

  • 計算復雜度

雖然HoloLens采用了32位英特爾Atom處理作為主處理器,並且將空間映射數據的處理負載交給HPU,但是對於復雜的全息場景而言,我們仍然需要盡可能的提高CPU的利用效率。

性能優化建議:

    1)物理組件

物理組件是全息場景中常用的組件之一,但是如果組件數量過多或計算頻率過快,則會導致CPU負載極大,導致場景fps一瀉千裏。因此,在保證功能的前提下,我們應當減少場景中不必要的物理組件,同時降低代碼檢測頻率,降低對CPU的開銷。同時在Unity3D中盡可能不要使用網格碰撞器(Mesh Collider),復雜的網狀模型雖然可以做到精確的碰撞檢測,但會帶來高昂的計算資源開銷,對於HoloLens而言性價比太低,應當使用其他網格較為簡單的碰撞器為優。

    2)腳本質量

事實上,CPU的開銷還與我們編寫的腳本質量密切相關。除了常規的腳本優化方式外,對於Unity3D項目而言,應當避免場景中出現過多的Update()循環。

如果場景中每個物體都具有Update()方法,這會導致引擎大量頻繁調用Update方法,帶來額外的CPU開銷。最佳實踐是,可以使用一個Manager對象統一管理其子物體,並在其Update方法中,統一更新其子物體UI

    3).NET Native

HoloLens項目本質上還是Windows 10 UWP項目,默認設置下,當使用Release模式編譯項目時,Visual Studio會使用.NET Native技術,將我們的C#托管代碼編譯為原生二進制代碼,大大提高應用的啟動速度和運行速度;使用Debug模式則不會使用.NET Native編譯,性能遠差於Release模式。因此,最佳實踐是確保在Release模式下編譯生成App,以獲得最佳性能。

技術分享

8 Release模式啟用.NET Native

    4)性能監視工具

進行HoloLens性能優化時可以使用現有性能監視工具來提高優化的效率,下面時可用的性能優化工具:

工具

監視維度

HoloLens Device Portal性能工具

功耗、內存、CPU、GPU和幀速

Visual Studio圖形調試器

(Visual Studio Graphics Debugger)

GPU, Shader和圖形性能

Visual Studio診斷工具

(Visual Studio Diagnostic Tools)

內存, CPU

Windows性能分析器

(Windows Performance Analyzer)

內存, CPU, GPU, 幀速

其中HoloLens的設備控制面板站點自帶性能工具,可以實時收集HoloLens設備的全部性能數據,同時還暴露了Restful API服務,允許我們調用其API獲取json格式的性能數據,用於自定義性能數據分析,十分靈活。

其他工具為Visual Studio自帶的性能分析工具,也可以很好幫助我們對應用性能進行評估。

技術分享

9 HoloLens Device Portal性能工具

總結


隨著HoloLensUnity3D引擎的集成度越來越高,開發的門檻大幅降低,越來越多的開發者可以享受到混合現實技術的樂趣,開發出奇幻的全息場景。與此同時,對於應用性能優化的渴求也越來越高,傳統的對CPUGPU和內存優化技巧仍然可以發揮巨大的作用,而針對平臺的最佳實踐也可以大幅提高應用的表現,兩者共同使用,才能得到最好的性能體驗。

HoloLens開發與性能優化實踐