1. 程式人生 > >一種生成中間幀技術,非同步時間扭曲(Asynchronous Timewarp)

一種生成中間幀技術,非同步時間扭曲(Asynchronous Timewarp)

   非同步時間扭曲(Asynchronous Timewarp 時間扭曲,即調整時長)調查

關於作者:邁克爾·安東諾夫他是Oculus的首席軟體工程師,領導SDK團隊,在來Oculus之前,他是ScaleformCTO,在那裡他領導硬體加速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.

在虛擬現實裝置中,為了正確在虛擬世界裡呈現一個人們的感知,必須要在顯示器上的定時更新影象,然而,如果渲染時間太長,一幀就會丟失了,產生的結果就是抖動,這是由於新的一幀影象還沒有被渲染出來,顯示器顯示了上一幀的影象,如果一幀影象被兩次渲染就會產生下面結果,如圖:

Timewarp5

這裡,眼睛轉向左側,這時影象又被渲染一次,影象落在視網膜的不同部分,導致雙影抖動。 

當然,雙影並不是唯一的結果,如果同樣的幀顯示三次,就會產生三重影,以此類推。 

基於方向的時間扭曲可以解決上午位置重影抖動問題,如果遊戲渲染幀沒有和頭部運動達成同步, 時間扭曲可以介入併產生一個影象替代還沒有被渲染出來的幀。 自從最後一幀被渲染,通過扭曲最後一幀來反饋頭部運動, 所以相比原始的幀加入ATW顯示會減少抖動,如果不加ATW不知道會發生什麼事情。 

在某些情況下,簡單的渲染扭曲處理可以工作的很好,這種技術已經在Gear VR 中實現了,當遊戲不能滿足幀率的時候ATW就會自動填充幀,這使得幀很平滑,但有許多細不太明顯的小瑕疵,因為 GearVR 缺乏位置跟蹤,並且避開了近場物件。下面討論的許多瑕疵應該怎樣減少或避免。

這也就是說,為什麼說相比ATWGear VR而言,ATWPC是更有意義和更有挑戰性的,讓我從Oculus Rift所支援的位置跟蹤開始探討。 

位置抖動(Positional Judder): 

位置抖動是最明顯的用基於方向的時間扭曲帶來瑕疵之一,在使用虛擬現實裝置時,當頭部移動了, 如果在ATW產生影象幀時只考慮了旋轉分量,那麼任何頭部平移分量都將被忽略了。這就意味著當你的頭部從一邊移動到另一邊時,甚至是旋轉你的頭並且你的轉動眼睛,你講看見離你很近的物體會有多個影象的抖動,這種效果是非常明顯的,在臨近場空間中,比如下面的這個潛艇截圖。 

timewarp1

近場物件多重抖動的影象示例。 

那麼,這種影響有多嚴重? 

這個顫抖的程度取決於玩家的運動方式,如果你保持你的頭部相對靜止並且只看風景,這種顫動將並不顯著,可以忽略不計。

注意:上述現象在Gear VR 中是非常常見的, 它沒有包含位置跟蹤, 然而,頭部模型產生虛擬的旋轉,所以當用Gear VR 在半速率玩遊戲的時候, 你仍然可以觀察到近場物體的抖動。 

如果看遠處物體, 頭部運動不太可能引起明顯抖動。 在這種情況下。ATW可以使你自由的看中遠處場景,並且沒有明顯的抖動。 

換句話說, 如果你離場景非常的近,當你頭部移動的時候,位置抖動將會相當明顯,就像沒有ATW一樣,這種抖動也會出現在當你近距離看帶紋理的地面的時候,這個場景離你非常近並沒有產生中間幀, 由此產生的感覺是一個讓人望而生畏,不穩定的世界,讓人非常迷茫和不舒服。 

位置扭曲(Positional Timewarp):

解決位置顫抖的一個可能的方法是實現全位置扭曲,它應用平移和旋轉兩個分量來修正原始幀,位置扭曲,位置扭曲需要考慮原始幀的深度資訊,由不同的量替代影象的一部分。 然而,這樣產生的中間幀會使物體邊緣不閉合,由於沒有原始幀中的資料,會導致中間幀某些區域不能被覆蓋。 

此外,位置扭曲代價更高, 不容易處理半透明,處理反走樣比較麻煩。位置扭曲並不能解決下面要討論的情形。 

運動的物體和動畫:

使用ATW時,動畫或者移動的物體引起另外一個瑕疵, 因為一個新的影象是隻是根據原始影象生成的,原始影象上並沒有物體的運動資訊, 對於所有ATW產生的中間幀都好像是被凍結了一樣,這個偽影表現為這些移動的物體,即抖動的多幅影象。

Timewarp2

場景中移動物體產生的抖動效果。 

這個偽影的影響取決於場景中物體數量投影面積,運動速度,如果數量或大小的物體很小或不快多個影象可能不是特別明顯然而,當移動物體或動畫覆蓋螢幕很大一部分,那將令人不安的。 

此外,幀率比,即遊戲幀率和顯示裝置重新整理率的比值會對運動的抖動效果造成影響,根據我們的經驗,ATW應該允許在一個固定的幀率區間內,例如,對於90赫茲的重新整理率,我們應該在45赫茲區間使用ATW, 這將導致影象增加一倍,但在視網膜的雙影象的相對位置將保持穩定渲染在一箇中間幀率,比如65赫茲,這將導致在視網膜上的影象數目和位置不斷變化,這是一個糟糕的中間幀。

鏡面反射: 

計算鏡面反射需考慮眼睛的方向, 或攝像機的方向, 由此生成一個圖片。 

 Timewarp3Timewarp4

由於眼睛或頭部運動,鏡面反射不再是正確的,這可能導致鏡面反射抖動。

像鏡面高光和反射依賴於眼睛位置一樣,還有許多其他依賴於眼睛位置的著色技巧也有類似的問題, 例如,視差貼圖和浮雕紋理對映將有類似的效果。 

實現:  

實現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存在的真正魅力。