翻譯: https://www.oculus.com/blog/asynchronous-timewarp/
異步時間扭曲(Asynchronous Timewarp 時間扭曲,即調整時長)
關於作者:邁克爾·安東諾夫,他是Oculus的首席軟件工程師,領導SDK團隊,在來Oculus之前,他是Scaleform的CTO,在那里他領導硬件加速Flash矢量圖形引擎項目,這個引擎被用到上百個視頻游戲中,在他的職業生涯里,他主要關注復雜的多線程體系結構,計算機圖形學,編程語言設計領域。
導言: 異步時間扭曲(Asynchronous Timewarp簡稱ATW)是一種生成中間幀的技術,當游戲不能保持足夠幀率的時候,ATW能產生中間幀,從而有效減少游戲畫面的抖動,但是,ATW不是靈丹妙葯,有一定局限性(局限性在后面介紹),開發人員也應該意識到。
簡介: 近一年來,圍繞着ATW這項技術已經有了許多令人興奮的進展,ATW技術讓虛擬現實設備保持較低幀率運行看到了希望,在虛擬現實穿戴設備中應用ATW,人為地填充中間幀,即使在幀率下降的情況下,也不會使渲染質量有顯著的下降。
在Gear VR(三星的一款虛擬現實穿戴設備)中,ATW是其重要組成部分,並積累了寶貴的經驗, 但是很不幸,經驗表明,在PC機上ATW通過位置跟蹤方法來解決虛擬現實系統抖動問題是有限的和有技術挑戰的,就像Oculus Rift(虛擬現實眼鏡)一樣。在一些情況下,在虛擬現實中應用ATW后的效果和由跳幀引起的抖動效果一樣糟糕。
在這篇博客中,我們分析了這些限制和導致特殊困難的原因,您將看到,ATW有時是有用的,但是還不能讓虛擬現實引擎滿幀運行,沒有達到完美體驗的程度。
時間扭曲(Timewarp),異步時間扭曲(Asynchronous Timewarp),和抖動(Judder)的概念:
時間扭曲是一種圖像幀修正的技術,在使用虛擬現實眼睛設備時,由於頭部運動過快,而造場景渲染的延遲,即頭已經轉過去了,但是圖像還沒有渲染出來,或者渲染的是上一幀的圖像, 時間扭曲它通過扭曲一副被送往顯示器之前圖像,來解決這個延遲問題。 最基礎的時間扭曲是基於方向的扭曲,這種只糾正了頭部的轉動變化姿勢,這種扭曲對於2D圖像是有優勢的,它合並一副變形圖像不需要花費太多系統資源。對於復雜的場景,它可以用較少的計算生成一個新的圖像幀。
異步時間扭曲是指在一個線程(稱為ATW線程)中進行處理,這個線程和渲染線程平行運行(異步),在每次同步之前,ATW線程根據渲染線程的最后一幀生成一個新的幀。
抖動和其具體細節在邁克爾·亞伯拉什的一篇文章中有詳細介紹(參見我翻譯的Ramblings in Value Time.)
在虛擬現實設備中,為了正確在虛擬世界里呈現一個人們的感知,必須要在顯示器上的定時更新圖像,然而,如果渲染時間太長,一幀就會丟失了,產生的結果就是抖動,這是由於新的一幀圖像還沒有被渲染出來,顯示器顯示了上一幀的圖像,如果一幀圖像被兩次渲染就會產生下面結果,如圖:
這里,眼睛轉向左側,這時圖像又被渲染一次,圖像落在視網膜的不同部分,導致雙影抖動。
當然,雙影並不是唯一的結果,如果同樣的幀顯示三次,就會產生三重影,以此類推。
基於方向的時間扭曲可以解決上午位置重影抖動問題,如果游戲渲染幀沒有和頭部運動達成同步, 時間扭曲可以介入並產生一個圖像替代還沒有被渲染出來的幀。 自從最后一幀被渲染,通過扭曲最后一幀來反饋頭部運動, 所以相比原始的幀加入ATW顯示會減少抖動,如果不加ATW不知道會發生什么事情。
在某些情況下,簡單的渲染扭曲處理可以工作的很好,這種技術已經在Gear VR 中實現了,當游戲不能滿足幀率的時候ATW就會自動填充幀,這使得幀很平滑,但有許多細不太明顯的小瑕疵,因為 GearVR 缺乏位置跟蹤,並且避開了近場對象。下面將討論的許多瑕疵應該怎樣減少或避免。
這也就是說,為什么說相比ATW在Gear VR而言,ATW在PC是更有意義和更有挑戰性的,讓我從Oculus Rift’s 所支持的位置跟蹤開始探討。
位置抖動(Positional Judder):
位置抖動是最明顯的用基於方向的時間扭曲帶來瑕疵之一,在使用虛擬現實設備時,當頭部移動了, 如果在ATW產生圖像幀時只考慮了旋轉分量,那么任何頭部平移分量都將被忽略了。這就意味着當你的頭部從一邊移動到另一邊時,甚至是旋轉你的頭並且你的轉動眼睛,你講看見離你很近的物體會有多個圖像的抖動,這種效果是非常明顯的,在臨近場空間中,比如下面的這個潛艇截圖。
近場對象多重抖動的圖像示例。
那么,這種影響有多嚴重?
這個顫抖的程度取決於玩家的運動方式,如果你保持你的頭部相對靜止並且只看風景,這種顫動將並不顯著,可以忽略不計。
注意:上述現象在Gear VR 中是非常常見的, 它沒有包含位置跟蹤, 然而,頭部模型產生虛擬的旋轉,所以當用Gear VR 在半速率玩游戲的時候, 你仍然可以觀察到近場物體的抖動。
如果看遠處物體, 頭部運動不太可能引起明顯抖動。 在這種情況下。ATW可以使你自由的看中遠處場景,並且沒有明顯的抖動。
換句話說, 如果你離場景非常的近,當你頭部移動的時候,位置抖動將會相當明顯,就像沒有ATW一樣,這種抖動也會出現在當你近距離看帶紋理的地面的時候,這個場景離你非常近並沒有產生中間幀, 由此產生的感覺是一個讓人望而生畏,不穩定的世界, 讓人非常迷茫和不舒服。
位置扭曲(Positional Timewarp):
解決位置顫抖的一個可能的方法是實現全位置扭曲,它應用平移和旋轉兩個分量來修正原始幀,位置扭曲,位置扭曲需要考慮原始幀的深度信息,由不同的量替代圖像的一部分。 然而,這樣產生的中間幀會使物體邊緣不閉合,由於沒有原始幀中的數據,會導致中間幀某些區域不能被覆蓋。
此外,位置扭曲代價更高, 不容易處理半透明,處理反走樣比較麻煩。位置扭曲並不能解決下面要討論的情形。
運動的物體和動畫:
使用ATW時,動畫或者移動的物體引起另外一個瑕疵, 因為一個新的圖像是只是根據原始圖像生成的,原始圖像上並沒有物體的運動信息, 對於所有ATW產生的中間幀都好像是被凍結了一樣,這個偽影表現為這些移動的物體,即抖動的多幅圖像。
場景中移動物體產生的抖動效果。
這個偽影的影響取決於場景中物體數量,投影面積,運動速度,如果數量或大小的物體很小或不快,多個圖像可能不是特別明顯,然而,當移動物體或動畫覆蓋屏幕很大一部分,那將令人不安的。
此外,幀率比,即游戲幀率和顯示設備刷新率的比值會對運動的抖動效果造成影響,根據我們的經驗,ATW應該允許在一個固定的幀率區間內,例如,對於90赫茲的刷新率,我們應該在45赫茲區間使用ATW, 這將導致圖像增加一倍,但在視網膜的雙圖像的相對位置將保持穩定,渲染在一個中間幀率,比如65赫茲,這將導致在視網膜上的圖像數目和位置不斷變化,這是一個糟糕的中間幀。
鏡面反射:
計算鏡面反射需考慮眼睛的方向, 或攝像機的方向, 由此生成一個圖片。
由於眼睛或頭部運動,鏡面反射不再是正確的,這可能導致鏡面反射抖動。
像鏡面高光和反射依賴於眼睛位置一樣,還有許多其他依賴於眼睛位置的着色技巧也有類似的問題, 例如,視差貼圖和浮雕紋理映射將有類似的效果。
實現:
實現ATW是有挑戰性的,主要有兩個原因:
1: 它需要GPU硬件支持合理的搶占粒度。
2: 它要求操作系統和驅動程序支持使GPU搶占。
讓我們從搶占粒度開始,在90赫茲,幀之間的間隔大約是11ms(1/90),這意味着為了使ATW有機生成一幀,它必須能夠搶占渲染線程並且運行時間少於11ms,然而11ms實際上不夠好,如果ATW在一幀時間區間內任意隨機點開始運行,那么起潛伏期(執行和幀掃描之間的時間)也將隨機, 我們需要確保我們不跳躍任何游戲渲染的幀。
我們真的期望ATW運行一直非常的短,短到在視頻卡產生新的一幀之前結束,剛好有足夠的時間來完成中間幀的生成,缺少自定義的同步ATW中斷例程,我們可以獲得高優先級搶占粒度和調度, 在最長2ms或更少的時間內。
原來,對現在的圖形卡和驅動實現來說,2ms搶占是一個艱巨的任務,雖然許多GPU支持有限的形式的搶占,但執行存在顯著差異。
1: 一些顯卡實現廠商和驅動程序允許搶占任一批處理或回執調用粒度,雖然有幫助,但不是十分完美(舉一個極端的例子,一個復雜的並包含很多繪制指令着色器可以很容易在10ms完成)。
2: 其他顯卡實現廠商和驅動程序允許搶占計算着色器, 但需要特定擴展來支持。
如果搶占操作不是很快,則ATW將無法搶在畫面同步之前生成中間幀。 這樣,最后一幀將會再顯示,將導致抖動,這意味着一個正確的實現應該能夠搶占和恢復任意渲染操作,和管線狀態。 理論上講,甚至三角搶占(triangle-granularity) 不夠好,因為我們不知道一個復雜着色器執行將花多長時間。 我們正與GPU制造商來實現更好的搶占,但是在這之前確實要因為這個問題花費一定時間。
另外一方面是操作系統對搶占的支持,在Windows8之前,Windiows顯示驅動模型(WDDM)支持使用“批處理隊列”粒度的有限搶占,對於內奸的圖形驅動程序,很不幸,圖形驅動程序趨向於大批量渲染效率, 導致支持ATW太粗糙。
對於Windows8,改善了WDDM1.2支持更細的搶占粒度,然而,這些搶占模式不被圖形驅動程序普遍支持,渲染管線將在Windows 10 或 DirectX12中得到顯著提升。 這為開發人員提供了較低級別的渲染控制,這是一個好消息, 但直到Windows10變為主流之前,我們還是沒有標准的方式來支持渲染搶占, 造成的結果是,ATW需要特定顯卡驅動的擴展。
ATW是有用的,但不是萬能的。
一旦我們普遍實現了GPU渲染管線管理和任務搶占, ATW可能成為另一種工具來幫助開發人員提高性能和減少虛擬現實的抖動, 然而,由於我們這里列出的挑戰的問題,ATW不是萬能的, VR的應用本身最好是維持較高的幀率,以提供最好的渲染質量。 最壞的情況,ATW生成的中間幀也可以導致用戶有不舒服的感受,換句話說,ATW無法根本解決這種不舒服。
根據生成中間幀的復雜性來說, ATW很顯然表明, 甚至是位置時間扭曲, ATW不會成為一個完美的通用的解決方案,這意味着只有方向ATW和位置ATW還算是可以的, 填充幀時偶爾會有跳躍。 為了產生一個舒適,令人信服的虛擬現實,開發人員仍然需要保持幀率在90赫茲。
試圖支持傳統顯示器和VR雙模式將會面臨很大性能困難,這種巨大的性能要求是對引擎的伸縮性的考驗,對於開發人員遇到的這種情況, ATW可能看起來很有吸引力, 如果達到90赫茲的頻率,將使VR具有很好的舒適性,這是VR存在的真正魅力。