1. 程式人生 > >Augmented Reality & Computer Graphics

Augmented Reality & Computer Graphics

Carmack

從延遲的角度來看,虛擬現實(Virtual Reality,VR)技術是一項最需要人在迴路(human-in-the loop)的應用。對於高質量的VR體驗而言,最重要的是使用者頭部物理運動與頭盔顯示器(Head Mounted Display,HMD)上實時重新整理影象到達使用者眼睛之間的延遲時間。人類的感官系統能在一定範圍內感知到視覺和聽覺中相對較小的延遲,但是當絕對延遲控制在大約20毫秒以內的時候,這些延遲幾乎就不可察覺了。目前互動式的3D系統造成的延遲要比這個數字高上幾倍,但是如果不斷除錯同一組硬體的話,我們終究會滿足要求。
- John Carmark

延遲問題似乎OculusVR所面對的主要問題,當然這也是VR整體需要解決的問題。延遲會導致不連續的遊戲體驗,並導致玩家的嘔吐和不適應,所以找出造成這一問題的所在和解決方法是十分重要的。

目前針對這些問題已經有了一些答案。在AltDevBlogADay網站上,卡馬克最近花時間解決了其中的一些問題,並向不明真相的群眾解釋了VR的真相。

那個帖子乾貨頗多,以下是其中的要點:
- 整個系統的延遲控制在50ms就會感覺相對不錯,但是還能感覺到。
- 當延遲低於20ms,人就無法感知出來了,這可以說是VR最佳體驗的標準。
-預測感測器資料可以被用於減緩一些系統延遲,但即使是最精準的人類頭部移動模型,在使用者實際使用的時候,還是會有預測不準的時候。
-濾波和通訊所帶來的延遲是持續存在的,但大多數感測器不同步的重新整理會引入了一個可變延遲,或者說當渲染的幀率與感測器的重新整理率不同的時候,也會造成延遲的不規律波動。
-早期的 LCD 螢幕在畫面滾動和變化的時候,因會有幾十毫秒的殘影而飽受詬病,但在過去二十年裡,這一技術有了長足的進步。LCD 每一個畫素點的轉換時間取決於色彩變化的程度,一塊優秀的面板的轉換時間能控制在大約 10ms 之內,而為 3D 顯示和遊戲而優化過的顯示器能減少一半左右的切換時間。
-一些不常見的顯示技術比 LCD 面板的重新整理速度更高;OLED 子畫素的重新整理時間低於 1ms,而鐳射顯示屏和 CRT 反應一樣及時。
-另一個不易察覺的延遲是:大多數顯示器是逐行顯示影象的,而顯示器的影象是從計算機裡讀取的,但由於計算機自身的原因,會導致幀率為 60fps 顯示器上,螢幕底部的畫面要比頂部的重新整理時間慢 16ms 左右。
-在靜止的螢幕上,這根本算不上問題。然而在 HMD 裡,因為源影象是即時渲染出的,但不同的部分顯示在螢幕上的時間是不同的,所以它可能造成影象的左邊或右邊被裁剪掉;或轉動頭部時,影象出現晃動。這個效應在使用 LCD 螢幕的 HMD 上不易察覺,但在重新整理更快的 OLED 螢幕的 HMD 上卻更容易顯現出來。
-立體渲染降低延遲的一個誘人的解決方案是:將圖形處理系統分拆成兩個,並分別配備一個 GPU,每個 GPU 只需單獨渲染一隻眼睛的影象,這樣可以達到最佳的效能表現和最低的延遲,其代價是要求裝置能夠管理兩個相互獨立的渲染內容的快取。
-但它的問題是如果裝置無法維持兩個 GPU 的快取,裝置的資料吞吐效能會下降,在快取過載的情況下,還會導致幀率更嚴重地下降。
-大多數模擬輸入的任務不直接依賴於使用者的輸入資料,換而言之,這一資料的輸入對一幀的延遲並不敏感。如果在需要使用者輸入的資料時取樣,而不是在一開始就離線快取輸入資料,則能減少總體的延遲。(這種方法被稱之為 late frame scheduling,延遲幀排程)。
-late frame scheduling 也是一種解決方案,但其缺點在於它使得排程需求非常緊湊——通常情況下,late frame scheduling 需要一定的時間,並會造成電力浪費。不過如果你的幀率是由視訊回掃決定的,而不是隨機讀取視訊片段,那麼通過圖片驅動輔助確定目前需要掃描輸出的準確位置,也會有助於降低延遲。
-另一個與 late frame scheduling 一樣,可以降低延遲的方法是:允許渲染編碼根據底層的遊戲編碼,以及使用者輸入的最新樣本,修正輸入到渲染編碼中的引數(這種方法稱之為 View bypass)。對比使用者前後輸入樣本,裝置可以確定出哪一個是使用者輸入的變數。而變數可以被用於修正遊戲提交給渲染編碼的視覺矩陣。
-這種變數處理的方式可以最小化處理的複雜程度,不過遊戲中也經常會有無需使用者輸入的渲染場景,比如經典鏡頭的剪輯或者玩家死亡的情形。一個為 VR 而生的遊戲應該是否應該避免這樣的情形尚有爭議,因為在 HMD 裡一個無法響應的視角是會讓人感到迷惑或者不快,但在傳統遊戲設定裡會有很多這樣的場景,這樣的場景很常見。
-如果我們能知道渲染一幀具體需要花費多長時間,那麼一些額外的延遲可以通過整個渲染任務的 late frame scheduling 來節省下來,但這顯然不實際,因為渲染時間難以預估。但渲染好的影象後是可以往後安排處理任務的,並且能爭取到一段可預測的時間,從而使得 late fram scheduling 更容易。(這一方法被稱之為 time warp)。
-繪製出一副高質量的影象之後(使用過 View bypass),這幅影象不是直接呈現出來,而是讓開發者繼續抓取使用者輸入的最新的資料,生成更新的視覺引數,然後計算出與輸入資料相匹配的已渲染影象需要變形成什麼樣,放置在什麼位置。經過這一次轉換之後,渲染變形後的影象能與與使用者實際操作後應該看到的影象更相符。
-「view bypass」和「time warping」是兩種互補的技術,它們既可以單獨使用,也能夠共同使用。time warping 可以將源影象的任意時間和位置變形成另一個,但是由於儘可能使用最新渲染出的影象,內部視差和螢幕邊緣的細節會丟失,而 view bypass 渲染則可以幫助提供這部分細節。
-動作狀態改變的操作,比如按下開關或者扣動扳機,通過線纜傳輸訊號,延遲依然只能控制到大概在 32-48ms 之間,但不可能低於使用過 view bypass 技術的 16-32ms 延遲。
-通過 bypass 的優化,關鍵的頭部轉動反饋在 60hz 的螢幕重新整理率下,延遲能夠保證控制在 2-18ms 之間。如果結合低延時感測器和螢幕,人們甚至覺察不到延時。連續不斷的 time warp 有可能將延遲降到 3ms 以下,這可能踏入人類和計算機都未曾探索過的領域。
-傳統的電腦互動介面大體上都沒有 VR 所需的那麼低的延遲,但是敏感的使用者能夠感覺出 20ms 或更低延遲之間的差異,這使得這項技術還能被用於 VR 之外的領域。
-一個比較有趣的應用場景是雲遊戲——使用者通過簡單的客服端或者應用傳送至遠端伺服器,然後伺服器持續不斷地回傳遊戲的視訊流。這能給予使用者難以想象的便利——但是由於受到網路和壓縮延遲的限制,這也降低了遊戲的體驗。
-View bypass 和 time warping 兩者也能在伺服器中起到作用,幫助減少由網路造成的很大一部分延遲。如果雲端遊戲客戶端能設計的足夠精巧,那麼 time warping 完全可以儲存在本地客戶端裡,但是它可能會明智地將減少的總延遲時間控制在 30-40ms 之間,避免與源影象之間差異過大。