日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VR游戏制作中“延迟”的优化方法

發(fā)布時間:2024/8/26 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VR游戏制作中“延迟”的优化方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

VR中的”延遲”, 特指”Motion-To-Photon Latency”, 指的是從用戶運動開始到相應畫面顯示到屏幕上所花的時間。
?


這中間經(jīng)過了大概這么幾個步驟:
?

  • 傳感器采集運動輸入數(shù)據(jù)
  • 采集到的數(shù)據(jù)進行過濾并通過線纜傳輸?shù)街鳈C
  • 游戲引擎根據(jù)獲取的輸入數(shù)據(jù)更新邏輯和渲染視口
  • 提交到驅動并由驅動發(fā)送到顯卡進行渲染
  • 把渲染的結果提交到屏幕, 像素進行顏色的切換
  • 用戶在屏幕上看到相應的畫面


當然, 實際上還有很多細節(jié)問題, 比如屏幕上的像素并不是同一時間切換的, 可能面上面的那行先切換, 再一行行更新到最下面的, 在這里就不糾結這些細節(jié)了。

這其中的每一個步驟都會產(chǎn)生一定的延遲, 而目前公認的大眾能接受的延遲是20ms以下, 這基本上可以做為衡量一個VR頭顯是不是合格的一個標準. 雖然20ms是非常短的時間, 但通過努力還是可以達到的, 主要有這么幾個思路:

硬件層面的優(yōu)化
?

  • 提升傳感器的采樣頻率, 減少刷新率與傳感器頻率的同步等待時間消耗
  • 提升傳感器的精度, 減少對采樣數(shù)據(jù)進行穩(wěn)定性過濾產(chǎn)生的延遲
  • 采用有線傳輸也有一部分原因是出于延遲的考慮
  • 屏幕使用OLED替代LCD, 減少像素顏色切換的時間
  • 提升屏幕刷新率, 主流的屏幕是60Hz, 那每幀就是16.67ms; 如果提升到90Hz, 那每幀就是11.11ms


大部分的手機VR產(chǎn)品在延遲上都是不合格的, 最明顯的表現(xiàn)就是轉頭時的畫面不連續(xù)/抖動/殘影等:
?

  • 市面上的手機采用OLED屏的還是少數(shù), 比如iPhone配個VR殼子那延遲就很感人
  • 如果依賴手機的陀螺儀進行轉向模擬, 其精度和頻率遠遠達不到要求
  • 手機屏幕目前都是60Hz的刷新率, 在延遲上本身就受限


刷新率的提升

假設刷新率為60Hz, 并不是代表每幀就有16.67ms的延遲, 而是說屏幕圖像每16.67ms才更新一次, 渲染選項中的”垂直同步”的概念就是來源于此. 這就對我們提交渲染畫面的時機要求非常高, 如下圖:
?


為了方便計算, 這里先假設傳感器, 傳輸, 屏幕像素切換的延遲都為0
?

  • 假設我們在每幀開始的時候(上一次垂直同步結束)采樣一次傳感器數(shù)據(jù), 在垂直同步之前完成提交, 那延遲就是16.67ms

  • 如果當前幀無法在16.67ms內完成渲染, 比如花了17ms, 那么就會拖到下一幀進行提交, 屏幕上顯示的畫面就還是上一次的圖像, 這時候的延遲就變成了16.67*2=33.33ms


這就對VR的渲染提出了非常高的要求:
?

  • FPS必須達到刷新率的要求, 90Hz就是90Hz, 80FPS是不行的, 會被垂直同步拖累成45FPS
  • FPS必須保證穩(wěn)定, 偶爾掉一兩幀在VR中的感覺非常明顯, 可能某個物體的位置已經(jīng)差了幾十個像素了


以Oculus Rift(消費版)為例, 1080x1200x2的屏幕分辨率, 90Hz的刷新率, 再加上因為變形所需要的UpSampling, 實際的渲染畫面就是3024x1680@90Hz, 這性能壓力幾乎與4k@60Hz相當. 所以, 單純的提升刷新率和分辨率, 目前來說渲染能力還是跟不上. 不過既然有了性能需求, 硬件廠商才有前進動力, 對整個行業(yè)生態(tài)來說, 是件好事.

引擎層面的優(yōu)化

除了拼命優(yōu)化降低每幀畫面的渲染時間外, 引擎層面還可以通過一些策略進行優(yōu)化, 關鍵的思路就是: 能不能把采樣傳感器數(shù)據(jù)的時間點盡量延后, 讓它與垂直同步的時間點盡量靠近?

這里我們仍然假設60Hz, 每幀時間16.67ms(約17ms), 忽略硬件延遲
?


如果在游戲邏輯過程中(1ms時)采樣傳感器數(shù)據(jù), 那延遲大約就是16ms
?


如果在渲染線程進行繪制之前(5ms時), 重新再采樣一下傳感器數(shù)據(jù), 修正一下視口信息(不會對游戲邏輯產(chǎn)生影響), 那延遲就縮短到了約12ms
?


做過渲染優(yōu)化的人都知道, 提交D3D Command后, 需要等待GPU執(zhí)行完畢, 這部分時間在整幀時間中的占比還是相當高的. 那有沒有辦法在渲染完成之后, 提交到屏幕之前再次采樣一次傳感器數(shù)據(jù)呢? 如果像下圖那樣的話, 延遲可以縮短到3ms!!!
?


這就是Timewarp的主要思想, 我們來看看它是怎么實現(xiàn)的

Timewarp

了解過延遲渲染的人應該都知道, 我們可以利用ZBuffer的深度數(shù)據(jù), 逆向推導出屏幕上每個像素的世界坐標
?


這就意味著, 我們可以把所有像素變換到世界空間, 再根據(jù)新的攝像機位置, 重新計算每個像素的屏幕坐標, 生成一幅新的圖像:
?

?


可以看到之前被遮擋區(qū)域的像素是缺失的, 因為我們的攝像機位置變化了. 那如果攝像機位置不變, 僅僅是朝向變了呢? 這樣就不存在像素可見性的變化了:
?


Timewarp正是利用了這個特性, 在保證位置不變的情況下, 手機游戲轉讓平臺把渲染完的畫面根據(jù)最新獲取的傳感器朝向信息計算出一幀新的畫面, 再提交到顯示屏. 由于角度變化非常小, 所以邊緣不會出大面積的像素缺失情況。


Oculus的Demo中可以停止渲染新的畫面, 完全由單幀圖像計算出各個朝向的新畫面:
?


也就是說, 只要角度變化不是非常大(上圖為了演示效果偏轉的角度很大了), 可以通過這項技術”憑空渲染”出下一幀的圖像, SONY的PSVR正是利用這一點, 把60FPS的畫面Reproject成了120FPS。

Timewarp只能處理頭部轉向, 不能處理頭部移動的情況, 而且一旦錯過了垂直同步的時機, 一樣需要等待下一次垂直同步才能顯示出來. 那能不能在每次垂直同步之前, 強制進行一次Timewarp呢? 那就需要驅動來開個后門了…

驅動層面的優(yōu)化

假設垂直同步時, 當前幀還沒有渲染完畢, 這時如果要進行Timewarp的話, 就需要驅動提供一種高優(yōu)先級的異步調用, 這就是異步Timewarp的由來: Timewarp操作與場景渲染并行執(zhí)行, 如果沒有新的渲染畫面, 就繼續(xù)使用上一幀的畫面進行Timewarp。


?


這可以在一定程度上補償FPS不達標造成的延遲問題, GearVR中正是應用了這項技術, 保證了手機VR的體驗。

當然, PC上使用項技術還是有一些限制:
?

  • 必須是Fermi, Kepler, Maxwell(或更新)核心的GPU
  • GPU是以DrawCall為單位調度的, 所以耗時太長的DrawCall是插入不了Timewarp繪制操作的
  • 需要最新的Oculus和NVIDIA驅動支持


異步Timewarp并不是說FPS低于標準還能流暢跑, 這只是一種補救措施, 所以優(yōu)化仍然要好好做-_-

驅動方面還有一些其它的優(yōu)化空間, 比如強制提交渲染隊列:
?


如果驅動中緩存了3幀, 那延遲優(yōu)化就白做了…
?


另外就是大家耳熟能詳?shù)腂ack Buffer(Double Buffer Rendering), 其實也會增加一點延遲, 不如省掉這一步, 即Front Buffer Rendering, 或者叫Direct Mode:
?

總結

以上是生活随笔為你收集整理的VR游戏制作中“延迟”的优化方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。