在移動手機(jī)端VR應(yīng)用需要更多的組件支持。首先是傳感器能夠跟蹤記錄用戶頭部的運(yùn)動,CPU驅(qū)動VR應(yīng)用程序(大多都是在后臺運(yùn)行),GPU負(fù)責(zé)處理和計(jì)算來生成正確的顯示圖像,向用戶或觀察者呈現(xiàn)變換后的內(nèi)容。
所有這些組件需要密切協(xié)作才能給用戶提供逼真的使用體驗(yàn)。眾所周知都會有一定延遲時間,這段時間被命名為“motion to photon latency”(即從用戶運(yùn)動開始到相應(yīng)畫面顯示到屏幕上所花的時間)。盡管它是一個專業(yè)術(shù)語,但是卻很好的描述了問題:伴隨用戶頭部的運(yùn)動,VR設(shè)備何時能夠意識到并給用戶展示正確的場景。
在真實(shí)世界中,這種情形很普遍以至于我們都沒有意識到——否則我們就會經(jīng)常走路撞墻了。然而將一個手機(jī)掛在頭部前端顯示VR場景,想要達(dá)到同樣的效果是非常困難的。原因有很多種:計(jì)算機(jī)運(yùn)行的時鐘頻率是固定的,流水線采用串行處理數(shù)據(jù),最明顯的就是最終圖像渲染花費(fèi)的時間。
我們作為一個GPU IP研發(fā)公司,當(dāng)然非常有興趣優(yōu)化我們的顯卡處理流水線以降低延遲,減少PowerVR顯卡處理器渲染最終顯示圖像所耗費(fèi)的時間。
對于Android系統(tǒng)和設(shè)備的組件要求
最終在安卓屏幕上顯示的內(nèi)容要采用組件的形式完成渲染。通常會有幾個廠家自定義符合自己要求的圖像,它們有自己的系統(tǒng)UI(顯示狀態(tài)欄和導(dǎo)航欄等)和前臺應(yīng)用程序(在設(shè)置的緩沖區(qū)中完成圖像的渲染)。
這些緩沖區(qū)會被一個“消費(fèi)者”線程所占用并且會直接反應(yīng)在屏幕的顯示效果上,大多數(shù)情況下在一個系統(tǒng)級應(yīng)用中這個“消費(fèi)者”線程通常被稱為SurfaceFlinger服務(wù)。
如果硬件支持SurfaceFlinger就可以決定將這些緩沖區(qū)中渲染的圖像直接在屏幕上顯示(以正確的組織布局)。這個模式被稱為硬件組件而且需要硬件顯示設(shè)備的直接支持。如果硬件顯示上不支持這個組織布局,SurfaceFlinger服務(wù)會采用一個幀緩沖器,利用GPU完成所有圖像的渲染并保存在幀緩沖器中,最后像正常情況一樣在顯示器上完成圖像組件的展示。

展示組件的處理過程
生成者線程和消費(fèi)者線程都是相互高度獨(dú)立的——實(shí)際上他們是不同的進(jìn)程,采用跨進(jìn)程的方式實(shí)現(xiàn)數(shù)據(jù)通信?,F(xiàn)在如果一方出現(xiàn)錯誤,就會出現(xiàn)混亂和意想不到的問題。
舉個例子生產(chǎn)者對一個正在向用戶顯示的幀緩沖區(qū)進(jìn)行渲染操作,那么用戶就會產(chǎn)生視覺沖突,這種情況稱為“撕裂”效應(yīng)。屏幕上的圖像一半是過時的內(nèi)容,而另一部分是重新經(jīng)過渲染的圖像?!八毫选毙?yīng)很容易判別,因?yàn)槠聊簧蠒忻黠@的切割線。
一個簡單的動畫展示“撕裂”效應(yīng)
為了防止“撕裂”效應(yīng),有兩個關(guān)鍵因素是必須的。首先就是各部分之間要保證適當(dāng)?shù)耐?,其次就是采用雙緩沖技術(shù)。
同步操作可以采用安卓“Native Syncs”框架來實(shí)現(xiàn),這個框架的一些標(biāo)準(zhǔn)和規(guī)范讓它能夠應(yīng)用于安卓系統(tǒng),它們借助內(nèi)核空間來實(shí)現(xiàn)系統(tǒng)全局同步,在用戶模式下使用文件描述符可以實(shí)現(xiàn)不同進(jìn)程間的數(shù)據(jù)共享。
它們也是非復(fù)用的二進(jìn)制同步機(jī)制,僅有“無信號”和“有信號”兩個狀態(tài),并且只有一種狀態(tài)的轉(zhuǎn)換就是從“無信號”到“有信號”(狀態(tài)是不可逆的)。
雙緩沖技術(shù)可以實(shí)現(xiàn)在舊的圖像內(nèi)容正在被消費(fèi)者線程所占用的同時,生產(chǎn)者可以渲染新的圖像內(nèi)容。當(dāng)生產(chǎn)者完成渲染操作,兩個緩沖區(qū)就會被轉(zhuǎn)換,消費(fèi)者則調(diào)用最新渲染的圖像內(nèi)容,與此同時生產(chǎn)者則開始渲染剛剛還在被消費(fèi)者線程調(diào)用的圖像內(nèi)容。
上面這兩種機(jī)制都是必須的,這樣才能在安卓系統(tǒng)上實(shí)現(xiàn)流暢的圖像輸出,但是不幸的是這仍然還有額外的延遲花銷。
就在三月份Khronos Group組織發(fā)布了“KHR可變的渲染緩沖器EGL擴(kuò)展”規(guī)范,我們利用這個規(guī)范實(shí)現(xiàn)了上述單緩沖器渲染功能。
這個擴(kuò)展標(biāo)準(zhǔn)需要GPU驅(qū)動和安卓操作系統(tǒng)的支持,正如我之前解釋的那樣,安卓系統(tǒng)很長時間一直都組織這種模式的操作,因?yàn)檫@樣會產(chǎn)生圖像“撕裂”效應(yīng)。
那么當(dāng)我們使用新的單緩沖器技術(shù)模式時如何組織“撕裂”效應(yīng)的發(fā)生呢?
屏幕技術(shù)
回答這個問題之前我們需要了解一下顯示器是如何工作的。GPU驅(qū)動會向顯示器驅(qū)動推送一個幀緩沖數(shù)據(jù)包,采用的數(shù)據(jù)格式是顯示器能夠解析的。這就可能對幀緩沖數(shù)據(jù)格式有不同的要求,例如特殊的形變或者紋理對齊。
顯示器會在下一畫面顯示新的幀緩沖圖像,假設(shè)顯示器從頂部到底部刷新新的圖像,“beam(刷新分割線)”又從顯示器屏幕底部返回到頂部,“vsync”或者垂直同步能夠及時的實(shí)現(xiàn)就比較關(guān)鍵了。
很明顯現(xiàn)在“beam”已經(jīng)不再使用了,但是這種命名法仍然被采用。因?yàn)楝F(xiàn)在顯示器不會再從幀緩沖器中取出任何數(shù)據(jù),我們完全可以直接切換新的圖像,并且確保不會出現(xiàn)“撕裂”現(xiàn)象。顯示器完成這個操作花費(fèi)的時間是固定的,與顯示器的時鐘周期相關(guān)。
通常一般的顯示器刷新周期是16.7ms,這意味著屏幕上的畫面每秒鐘可以刷新60次。

顯示器掃描加載過程
現(xiàn)在的手機(jī)通常采用16:9的顯示比例,屏幕都是安裝好的因此對掃描加載過程進(jìn)行了優(yōu)化,采用豎屏的加載模式,因?yàn)榇蠖鄶?shù)用戶每天都是這樣使用他們的手機(jī)的。
對于VR則不同,VR應(yīng)用則是橫向顯示,因此顯示器加載方向變成從左到右進(jìn)行。
因此讓我們看看如何更新幀緩沖器同時又要在屏幕上顯示,這是相當(dāng)重要的。
條帶式渲染
當(dāng)顯示器掃描加載緩沖器中的圖像時,它的掃描加載速率通常是固定的。條帶式渲染技術(shù)則是改變緩沖器中未被顯示器掃描加載的那部分圖像數(shù)據(jù)。主要分為兩種不同的策略,在顯示器下一次掃描加載過程中改變屏幕顯示的部分畫面。
這個被稱為光線追蹤,我們需要在掃描加載線的前面進(jìn)行渲染然后更新幀緩沖器中的內(nèi)容,這樣在顯示器屏幕上的內(nèi)容就會不同。另一種策略則是光線追趕,意思就是滯后掃描加載線,更新其后面的內(nèi)容,正好與上一種策略相反。
光線追蹤技術(shù)能更好的解決延遲問題,但是同時也更難實(shí)現(xiàn)。GPU需要保證在非常緊張的實(shí)現(xiàn)內(nèi)完成圖像渲染操作。這種保證在多進(jìn)程的操作系統(tǒng)中很難完成,因?yàn)榇蟛糠謶?yīng)用進(jìn)程都在后臺運(yùn)行,與此同時GPU還要完成另一個幀緩沖器的渲染任務(wù)。因此更為簡單的實(shí)現(xiàn)方法則是光線追趕策略。

光線追趕策略實(shí)現(xiàn)條帶式渲染
VR應(yīng)用需要向顯示器請求最新一幀畫面的掃描加載時間,并實(shí)時調(diào)整自己以確保完成全屏幕的渲染任務(wù),然后再屏幕上呈現(xiàn)。為了計(jì)算一個條帶開始渲染的時刻,首先我們需要定義條帶的尺寸。條帶的尺寸和條帶的數(shù)量是可以定義的,這取決于顯示器掃描加載的速度以及我們渲染每個條帶的所需要的時間。在大多數(shù)情況下一般采用兩個條帶式最優(yōu)的。在VR應(yīng)用中正好分為兩部分對應(yīng)人的左右眼(我們是從左向右進(jìn)行掃描加載),這樣實(shí)現(xiàn)起來就更加容易了。在下面的例子中我們使用四個條帶來向大家展示是如何工作的,前面提到過渲染整幅畫面的時間是16.7ms。
通常渲染每個條帶的時間可以是4.17ms。VR應(yīng)用在顯示完最后一幀畫面后等待4.17ms然后開始渲染第一個條帶,渲染第二個條帶時則需要再等待4.17ms(則從開始一共等待了8.34ms),重復(fù)這樣的操作直到四個條帶都完成渲染,然后開始新一輪的操作。顯然我們需要考慮每幀渲染提交所用的時間,并適當(dāng)調(diào)整我們的時序,使用絕對時間證明是最準(zhǔn)確的方法。
渲染VR模擬圖像使用的條帶分離技術(shù)
最后的一點(diǎn)兒想法
降低移動設(shè)備中VR應(yīng)用的延遲是現(xiàn)在開發(fā)者面臨的重大挑戰(zhàn)之一。這不同于桌面的VR解決方案,桌面解決方案擁有更好的處理能力而且也不會遇到散熱問題的限制。
電子發(fā)燒友App




























評論