vr現在正處於風生水起的階段,但是vr的性能一直是大問題,最主要的問題就是響應延遲,玩家改變位置到這一位置的圖像被cpu提交,gpu渲染,同步刷新到頭部顯示設備上,這中間的延遲會導致用戶的頭暈,減少相應的延遲,是vr從硬件到軟件一直在優化的問題。Nvidia針對這個,新推出了VRWorks組件,這是一套軟硬件結合的改善響應延遲以及提高vr渲染效率的方案,從硬件上做了一些改進和加速,同時也提供了一組api,去爲你的vr應用和vr設備提供優化的方案,每當技術存在瓶頸時,硬件的改進永遠是推動性巨大的。在vrwork的優化方案中,有很多很值得學習和研究的地方,也有助於我們理解vr的性能瓶頸所在,這裏做一下歸納。
vr的性能瓶頸來源
VR WORKS的優化
1.vr sli 多顯卡支持
2.Multy Resolution Rendering 多分辨率渲染。
這個在vr領域算是經典的優化了,很多vr設備都做了這個,原理來源於,vr的圖像爲了適應眼鏡的變形要做捲曲(wrap),如圖
3.asyncchronous timewarp 異步時間捲曲
timewarp也是vr很經典的優化,在occlus等早已使用,如果沒有timewarp,我們會感覺很大的延時和眩暈。因爲就算幀率再高,我們看到影響的那一剎那,渲染的也是過去某個時刻的圖像,和我們當時所處的位置是不一樣的,這種不一致隨着幀渲染耗時的增長而增長,這種timewarp的做法是,在gpu繪製結束,掃描給顯示屏前,將這個圖像做一個圖像空間的位移,以校準我們當前的位置,也就是說處於p0位置渲染的圖像,在p1位置繪製好給我們,我們需要將其校準成p1位置的樣子,這種校準有很多算法,都是在圖像處理上做的平移,這樣我們會感覺到看見的和我們的位置是同步的。
但是在傳統的渲染中,這些工作是在一個流水線上的,也就是同步的,當某一幀很耗時很卡時,用戶會遲遲收不到當前位置校準的圖片,一直停留在上一幀的圖片,因爲gpu卡住了,後面的校準(timewarp)也不能進行,用戶會感覺強烈的卡和眩暈。
這裏就提出了一個異步 timewarp的概念,即在gpu上有一個獨立的線程做這個warp,即不管你主線程渲染卡成什麼樣,我這個獨立的線程會按照幀率給你每個位置的warp,給你最新的基於你位置的圖像,這能解決很卡很卡時我們依然能夠得到模擬的圖像。但是傳統的gpu不支持這種獨立的線程。nvdia的vrworks加入了這個。他加入了一個high-priority context的概念,允許用戶啓動一個優先級最高的線程最warp,獨立於你的渲染線程。
4. direct mode
傳統的渲染,pc的顯示器會把vr眼鏡作爲顯示器的一個顯示擴展,vr眼鏡和gpu是沒有直接交互的,而vrwroks裏可以開啓vr headset的直接模式,讓gpui直接將圖像掃描到vr設備。
5.Front Buffer Rendering
在direct mode下允許直接渲染到vr設備的front buffer上,還是爲了減少延遲,但是直接到front buffer 上的畫面撕裂問題怎麼解決?
這就是nvidia vr works對vr的性能的優化,也許對於vr應用開發是個好的消息,同時從中我們也可以一窺vr中的性能瓶頸和解決思路。
最後這是vr works 現在的軟硬件支持情況:
pc, D3D11 only, windows7 +, Multi resulution rendrering 要gtx 900+(maxwell arc),其他的那些要GTX 500 +。
nvidia的開發者頁面、
https://developer.nvidia.com/vrworks