榨取最大潛力,詳細解讀Oculus Go三大關鍵技術
映維網希望通過這篇以技術為重點的文章來向你介紹和解釋其中三種技術
(映維網 2018年03月26日)當Oculus Go正式發售的時候,這款設備將以合理的價格為用戶提供卓越的性能。為了實現這一點,Oculus創新了數項需要開發者理解的技術,從而幫助其實現設備的最大潛力。映維網希望通過這篇以技術為重點的文章來向你介紹和解釋其中三種技術:固定注視點渲染(Fixed Foveated Rendering),動態節流(Dynamic Throttling) 和72Hz模式(72 Hz Mode)。
1. 固定注視點渲染(FFR)
我們先從固定注視點渲染技術開始。FFR這種技術主要是以低於中心注視點區域的解析度渲染眼睛紋理的邊緣。這種幾乎無法察覺的效果降低了用戶外圍視覺的場景保真度。由於需要著色的總像素更少,因此FFR可以顯著提高GPU的填充性能。藉助FFR,一系列的應用程序都可以大幅度提高在眼睛紋理的解析度,從而改善最終的圖像。複雜的片段著色器同樣能受益於這種多解析度渲染形式。需要注意的是,Oculus的FFR技術不同於其他形式的注視點渲染技術,Oculus Go的系統不基於眼動追蹤。高解析度像素「固定」在眼睛紋理的中心。
1.1 畸變和像素密度的問題
與傳統的2D屏幕不同,VR設備需要翹曲圖像以匹配頭顯透鏡的曲率。這種畸變能夠為我們提供比單純通過原始顯示器感知的更寬視場。下圖顯示了畸變的影響:2D平面(水平線)翹曲成球形。
如果仔細觀察,你會發現眼睛紋理在這種畸變過程中的像素表現非常不均勻。與創建視場中心所需的像素相比,我們需要更多的像素才能在視場邊緣(側邊藍色圓錐體)創建後畸變區域。這導致視場邊緣的像素密度高於中間的像素密度。但這完全是適得其反的現象:用戶大多是把注意力放在屏幕中心。最重要的是,透鏡模糊了視場的邊緣,因此即使你在眼睛紋理的邊緣渲染了很多像素,圖像的清晰度也會丟失。GPU花費大量的時間在視場邊緣渲染像素,但用戶卻無法清晰地感知它們。
1.2 節省像素計算時間
為了避免時間浪費,固定注視點渲染會在計算過程中降低輸出圖像的解析度。對於Oculus Go,這是通過控制GPU上各個渲染瓦片的解析度來實現。Oculus Go搭載了高通821 SoC。與大多數移動晶元組一樣,它是一個瓦片渲染器。瓦片渲染器不會像桌面GPU那樣按順序執行渲染命令,而是將工作量劃分為矩形(或瓦片),然後進行並行渲染。通過控制各個瓦片的解析度,並且確保眼睛緩衝區邊緣的瓦片解析度低於中心區域,我們可以減少GPU需要填充的像素數量,同時不會明顯降低畸變後圖像的質量。對於需要渲染大量像素的應用程序而言,或者對於採用昂貴片段著色器的應用程序而言,這能夠帶來非常顯著的GPU性能優化。
下面屏幕截圖是Oculus Go上的一個1024×1024眼睛緩衝區的瓦片解析度乘數效應映射,其中FFR啟動了最大的注視點渲染級別:
在視場中心的白色區域,解析度是原生解析度:紋理的每個像素都將由GPU獨立計算。但在紅色區域中只計算一半像素,綠色區域是四分之一,藍色區域為八分之一,最後洋紅色區域則只有十六分之一。當GPU將計算結果存儲在通用存儲器中的時候,系統將在解析時從所計算的像素中插值缺失像素。
固定注視點渲染不是一種通用的解決方案。由FFR引起的偽影可感知度取決於場景內容。例如在《The Well》運行FFR的時候,我們可以看到聖池場景中的高對比度文本元素出現了顯著變化。下圖是在四種不同FFR設置下的部分渲染場景(左邊沒有啟用FFR,右邊則是最大值的FFR),主要側重於頭顯屏幕右下角區域:
我們可以注意到,像Oracle的手臂和她的直接環境等低頻內容完全不受FFR的影響。但高頻紋理(如文本)由於是以較低的解析度進行渲染,其出現了嚴重的像素偽影。在觀察「Oracle」這個單詞時,你甚至可以發現一個個單獨的瓦片。其中,單詞左側和右側是在以不同設置渲染的不同圖塊上呈現。我們難以在頭顯內部注意到這種偽影,因為它們只出現在我們的外圍視場,而且透鏡模糊了它們。固定注視點渲染的API允許開發者調整FFR級別(甚至是逐幀調整),這樣可以在最大限度上減少可見的偽影。在大多數情況下,我們只需為遊戲內場景啟用FFR,而菜單或UI屏幕中則調低或關閉FFR。
Unreal 4,Unity和原生應用程序可以從固定注視點渲染中受益。我們注意到,像素密集型的應用程序獲得了高達25%的增幅。請注意,如果應用程序搭載了不受GPU填充限制的簡單著色器,固定注視點渲染可能無法為其帶來顯著的提升。
2. 動態時鐘節流和移動性能管理
所有移動設備都必須處理散熱和電池問題。移動晶元組的效率非常高,但它們在處理棘手問題時仍會產生大量的熱量,並且消耗大量的電量。在手機或平板電腦上,過載的移動CPU通常會降低速度以避免過熱,這是正常現象。在VR設備上,這通常會導致應用程序的幀率丟失,並且立即造成用戶不適。一直加熱直至性能下降對於VR頭顯來說不是一個優秀的解決方案。
為了幫助開發者管理應用程序整體的熱耗,Oculus為Gear VR開發了固定時鐘策略(Fixed Clocks Policy)。開發者可以選擇一個CPU和GPU「級別」,這可以支持他們動態地上下調整晶元的時鐘速度。這種系統可以幫助開發者根據需要將電能路由至CPU或GPU,並在空閑時段或簡單場景中降低整個系統的時鐘速度。早期的Gear VR遊戲《Herobound》就是根據每個人的需求設置了不同的CPU和GPU時鐘。
對於Oculus Go,Oculus簡化了CPU和GPU的級別管理,令其變成幾乎是完全自動運行。Oculus將這項功能稱為動態節流(Dynamic Throttling)。
Oculus Go的應用程序與Gear VR兼容,而且基本電源管理API保持不變。開發者可以將CPU和GPU級別設置在0和3之間,而這將轉換為晶元可以運行的不同時鐘速度。但現在這種級別已被視為基準,而為了保持性能,系統可以根據需要選擇動態地計時CPU和GPU。這一系統的目標是保留Gear VR固定時鐘策略的優勢,同時試圖減輕固定時鐘策略的缺點。
Oculus Go的散熱比智能手機更高效。這使得Oculus能夠創建CPU和GPU級別4,從而釋放出比S7更高的性能。Oculus希望平台上所有的應用程序(不僅只是為Oculus Go開發的應用程序)都能從這種改進中受益。根據以前的工作,Oculus開發了一個可以根據CPU和GPU利用率調整節流級別的動態系統,從而最大限度地提高性能並且最大限度地減少熱量增加和電池消耗。
編寫動態調節器聽起來似乎很簡單,但實際上並非如此。一個主要挑戰是構思出能夠實際量化處理器利用率的方法。
對於GPU來說,這是一個非常簡單的任務。GPU是高度並行的系統,但它們一次只能處理一個問題。要麼GPU正在處理幀(計算像素,傳輸數據等等),要麼它什麼都不做。最後我們計算GPU利用率的方法是,簡單地將GPU工作時的計時周期數除以GPU執行頻率中的計時周期數。由於Oculus Go的管道是並行進行(在GPU渲染最後一幀的時候CPU處理下一幀),所以我們很容易判斷GPU是不是瓶頸:要麼充分利用了GPU並且導致CPU等待;要麼GPU不是瓶頸。在查看節流機會的時候,GPU利用率低於90%,因此表明應用程序不受GPU限制,因此我們不需要提高其時鐘速度。
但計算CPU的利用率要困難得多。Oculus Go的CPU是多核處理器:一個內核可以在另一個內核處於休眠狀態時工作,這使得我們很難判斷CPU執行速度是不是應用程序整體性能的瓶頸。例如,請留意下圖這個資源密集型應用的追蹤信息。
你可以發現上圖存在大量的白色區域,表明這是一個「無所事事」的內核,看起來這個應用程序似乎存在很多空閑周期。但請仔細觀察,其中一個內核(CPU 2)幾乎受限於渲染線程(RenderThread):一次渲染線程執行的結束與下一幀新周期開始之間的時間差不到一毫秒。在這種情況下對CPU進行計時會導致幀丟失。
查看多核處理器的原始利用率可以提供一定的有用信息,但不足以支撐CPU節流的正確決策。幸運的是,我們在運行時內置了另一個信號,這可以幫助我們判斷適合節流的應用程序:丟幀計數器。在VR中渲染時,Oculus的API會追蹤每一個丟失幀。低丟失幀的應用說明它正在實現其目標幀率,而且或許能以較低的時鐘速度運行。另一方面,當GPU顯然不是瓶頸時,一個丟失大量幀的應用表明即使某些內核似乎正在「睡覺」,我們也應該提高CPU的時鐘速度。
Oculus Go的調速器永遠不會將CPU或GPU的時鐘速度調低至開發者設置的級別。但當調速器檢測到系統負載很重的時候,它會提高時鐘速度以確保更流暢的體驗。下圖是Oculus Go首次運行搭配高端著色器的Unreal 4應用《Daedalus》的第一關,其中關閉了動態節流功能。紅線代表了GPU利用率。底部洋紅線代表了丟失幀。綠線是GPU級別(因為動態節流器關閉,所以保持不變)。棕色線和藍色線則代表CPU利用率(分別為代表全內核運行和最差內核運行)。
儘管前45秒的運行沒有任何問題(開頭丟幀的出現主要是因為關卡載入),但你可以看到GPU利用率一直都的維持在非常高的水平,大約是85%。在50秒後,GPU利用率達到95%的高峰。隨著GPU成為瓶頸(紅線上升),掉幀開始出現。最高峰時,在平均每秒幀率為40fps的情況每秒丟失20幀。
如果你運行相同的應用和關卡,並且啟用Oculus Go的動態節流,圖表將如下所示:
雖然應用程序要求GPU級別2,但系統將時鐘速度提高至GPU3,從而將利用率維持在75%左右。系統正確地判斷應用程序不受CPU限制(未出現丟失幀),因此CPU時鐘在整個會話期間都保持在級別0。在接近捕捉結束時,亦即大約50秒後,系統注意到GPU負載已經增加,所以將GPU的時鐘頻率提升至級別4。GPU負載峰值在約15秒後結束,而系統則相應地降低了GPU的時鐘頻率(一下子降至級別2)。如圖表所示,
當結合固定注視點渲染時,動態節流可以為Oculus Go解鎖新的性能水平。這種性能可以應用於更優秀的場景或著色器複雜度,或者輕鬆用於增加眼睛紋理解析度,在無需改動asset的情況下提高應用的視覺質量。部分開發者可能同樣選擇在Oculus Go的支持的新模式上花費一定的額外幀時:72Hz模式(72 Hz Mode)。
3. 72Hz模式(72 Hz Mode)
Oculus為Oculus Go帶來的另一項新功能是72Hz模式。藉助這一模式,Oculus Go應用可以把目標幀率瞄準72fps,而非常規的60fps。這種模式並非強制,只是單純的可選項。72Hz模式在特定情況下的成本投入非常大,但能夠顯著提高支持應用程序的質量。
3.1 為什麼是72Hz模式呢?
一般來說,VR設備的高幀速率與降低延遲相關聯,特別是在涉及位置追蹤的時候。Oculus Go不是一款定位追蹤設備,雖然較低的頭部追蹤延遲很舒適,但這不是以72Hz速度運行的主要原因。相反,72Hz模式是的目標是改善顯示器的視覺質量。
Oculus Go的顯示器在60Hz已經能帶來舒適的體驗。72Hz模式允許顯示器變得更明亮,同時不會造成可感知的抖動,從而提高屏幕的視覺質量。特別地,由於這種模式令顯示器更明亮,顏色將顯得更柔和。
3.2 為72Hz進行優化
當運行在Oculus Go時,任何可以支持72fps的應用程序都應該使用72Hz模式。這意味著渲染速度至少比平時快2.8毫秒(通常而言這並不總是可以實現)。結合動態節流和固定注視點渲染,部分應用可以直接啟動這一模式並以更高的幀率運行。其他應用則需要進行大量的優化才能實現這一性能水平。再次強調,72Hz模式是可是一個可選項,並非強制要求。
3. 視頻
視頻應用應該仔細考慮72Hz 模式。與72fps相比,以30fps或60fps渲染視頻的應用程序在60fps速度下的畫面看起來更好。另一方面,在72Hz模式下運行時,24Hz的視頻看起來將好很多,因為顯示器和視頻幀速率是同步的,能夠避免畫面撕裂(24是72的偶數除數)。你可以在運行時無縫切換模式。
4. 加油吧
為了令Oculus Go成為市場上最佳的VR一體機設備,Oculus投入了大量的經歷。隨著諸如固定注視點渲染,動態節流和72Hz模式等功能的增加,Oculus期望將能降低為設備開發出優秀應用的眾多阻礙。Oculus表示,他們將繼續為開發者的前進清除障礙。所以,請大家加油吧。
原文鏈接:https://yivian.com/news/43155.html
※提升力反饋,微軟為VR研究物理連接器Haptic Link
※軍工AR創企NGRAIN被mCloud收購
TAG:映維網VR |