Oculus Medium移動工具的開發日記
Oculus Medium是一款專為Touch設計的沉浸式VR體驗,你可以在VR環境之中雕刻,建模,繪製和創建有形對象。Oculus最近添加了Move Tool,它允許用戶抓拿,移動和重新設置雕刻作品的一部分。「Move Tool」是Medium「Summer of Move」(1.2版本)更新的主要功能之一,這也是Medium用戶長期以來的反饋要求。
GIF
在本文中,我們將會討論如何非同步安排對性能要求巨大的操作。從創意應用到遊戲,這對所有需要同時維持VR幀率和運行計算量巨大的任務的軟體而言都十分有用。
1。 實時預覽
我們將Move Tool操作分為兩個階段:第一個是實時預覽;第二個是所需時間更長的移動操作處理。
在第一階段中,響應時間是關鍵。你需要能夠通過細微的手部運動來操作雕刻。在雕刻時,「看起來逼真」與「看起來不對勁」之間只是一線之差,所以Medium必須允許你移動雙手並實時判斷結果。
為了實現這一點,第一個階段要通過Move Tool的位移欄位來抵消頂點著色器中的頂點位置。這對性能幾乎沒有影響,因為它只是位移矢量的簡單計算,以及添加到每個頂點位置的偏移量。然而,這個階段確實需要一些可以影響渲染質量(但不是性能)的捷徑。例如,這個階段不會重新計算網格的頂點平均量,因為它正在變形,而且我們不重新計算環境遮擋。
在第二階段中,我們將處理對性能要求更高的任務:我們變形三角網格,將變形網格轉換回一個指向距離場,並從SDF重新生成三角網格。這能有效重新拓撲化曲面,從而允許操作均勻鑲嵌網格的後續移動操作。作為從SDF重新生成網格的一部分,我們重新計算頂點平均量和環境遮擋。在這個階段之後,雕刻將再次正確地呈現。
儘管我們儘可能快地優化這一代碼,但第二階段的所需時間要遠多於單個90Hz幀。小幅度的移動看上去和感覺上近乎是立即執行,而更大幅度的操作則需要數秒時間。時間與正在移動的數量成正比。
當第二階段超過1秒的時候,我們將顯示Medium標誌的動畫,以說明操作需要一定的時間,而Medium不接受任何新的指令。我們將其稱為「hourglass hands(沙漏手)」,因為這類似於Windows的沙漏標誌或OSX的旋轉指針。
你可以想像,你正在通過Move Tool告訴計算機一系列的指令。當你按下扳機鍵的時候,你正在告訴電腦「讓我告訴你我想要你做什麼」;當你釋放扳機鍵時,你正在告訴計算機「現在為我生成結果」。當你告訴計算機你希望它為你做什麼的時候,你能夠實時在VR中使用雙手是關鍵;但當你告訴計算機生成結果時,即使等待幾秒鐘也不會造成太大的影響。只要你的沉浸感不受干擾(眼睛接收90Hz的幀,系統能夠繼續精確追蹤你的頭部和手部運動 ),這一切都可以接受,因為你的虛擬現實幻覺不會遭到破壞。
Medium中的音效設計強化了正在發生的事情。當你按下扳機鍵並開始一個移動操作時,我們會播放一個弱拍音效;當你釋放扳機鍵並完成移動操作時,我們會播放一個強拍音效。當第二階段完成時,我們會播放最後的「叮」音效。這種音效設計能夠有效告訴你計算機正在做什麼。桌面端的內容創作應用很少使用音效,但對於虛擬現實應用而言,音效是沉浸感的一個重要組成部分。
顯示沙漏手和阻擋用戶輸入的做法借鑒了桌面GUI應用。如果一切都足夠迅速,我們將不需要這樣做,而這是最理想的情形。但對VR應用中的冗長操作而言,這是一種切實可行的手段。
於1968年發布的論文《Response Time in Man-Computer Conversational Transactions》中寫道,100毫秒或以下的操作將令人感覺是實時發生;1秒是不影響用戶思路的界限;10秒是保持用戶注意力的界限。對於虛擬現實世界中的臨場感,Medium生成新一幀的所需時間需要靠近10毫秒。Move Tool能夠符合這一系列的界限:第一階段運行在VR幀率之下;第二階段在1秒內結束,或者如果超過1秒,我們就會顯示沙漏手。
2。 非同步雕刻操作
VR模擬必須每90Hz或約10毫秒產生新的一幀,但Medium中的許多操作都比生成10毫秒幀需要花費更長的時間。答案?這當然是我們在非同步運行的線程上計算這些冗長的操作。這是另一個能夠為所有VR應用提供幫助的解決方案。
當你在Meidum中添加新的黏土時,在完成操作和顯示結果之前通常會出現數十毫秒的延遲。但由於每90Hz將提供新的一幀,所以你的頭部和手部會實時移動。只要頭部和雙手實時移動,你就不會注意到雕刻操作出現延遲。虛擬現實技術要求幾乎是即時對頭部和手部運動作出響應,但應用程序的結果仍然可以以較低的頻率運行。
想像一下你正在使用自己最喜歡的桌面應用:在現實世界中,你的眼睛會從現實世界中接收到穩定的光子流,但計算機本身可能以更低的頻率在平面屏幕上生成幀。這正是我們在Medium中的做法,也是我們可以把性能要求苛刻的3D內容創建帶到實時VR應用的解決方案。
這類似於電腦屏幕上的滑鼠游標。你期望滑鼠游標可以立即響應你的手部操作,但你不一定期望應用程序能以相同的速度運行。
在幕後,Medium幾乎像是兩個不同的程序。一個程序負責雕刻和網格處理,而另一個程序則負責所有的渲染。雕刻和網格操作不會以VR幀率執行,但渲染需要。
部分幀在渲染時會下降到90Hz。對於這些幀,Medium將依靠於非同步時間扭曲和非同步空間扭曲來流暢地Rift提供新影像。
從下面你可以看到Medium的應用內分析工具。頂端的橙色條是每幀的時間,而你可以看到其相當穩定。視頻中出現了多次移動操作,而每一個都需要數幀才能完成。有4個CPU線程正在進行中,以藍色/紫色條顯示。最頂端的線程是主線程,其正在持續地生成幀;後三個線程則在執行移動工具任務,與主線程非同步運行,並需要數幀才能完成。它們不會影響整體的幀時間。
Medium使用單個CPU線程進行渲染,而這產生了供GPU使用的OpenGL指令。GPU渲染供Rift頭顯顯示的立體影像。這兩個線程每10毫秒將產生一個影像。
其餘的CPU硬體線程執行雕刻操作和其他較低優先順序的任務,如視頻記錄,在後台載入資源等等。雕刻操作可以在所有可用線程中並行工作,而且我們使用英特爾的ISPC編譯器來為性能密集型代碼生成SSE4和AVX2代碼。
雕刻線程和主線程通過producer/consumer FIFO相互連接。由於新的網格數據是由雕刻線程生成,因此將其放入FIFO中。主線程花費最多兩毫秒從該FIFO中複製數據,並為GPU做好準備。一旦經過兩毫秒,我們就停止從FIFO中複製數據,然後繼續渲染。我們在CPU幀時間預算中包含了兩毫秒,以避免在更新數據時出現故障。當FIFO變滿時,雕刻線程將停止,並等待主線程從FIFO中使用數據。這可以平衡工具操作的延遲,從而保持一致的幀率。
我們目前使用CPU來負責雕刻和網格任務。GPU可以更快完成相關任務,但GPU已經被渲染佔用,特別是對我們最低規格的設備而言。即便存在,最低規格GPU上的空閑時間也是相當少。因此,儘管GPU在這方面可以輕鬆擊敗CPU,但畢竟CPU擁有更多的可用資源。也就是說,我們正在研究讓GPU負責更多的雕刻任務,同時仔細觀察,並確保我們不會影響幀速率。
確保非同步雕刻操作的延遲不會變得太長非常重要。例如,如果你按下扳機鍵來添加黏土,但半秒後仍然沒有任何東西顯示,這就會令人感到沮喪。當延遲時間過長時,應用程序就會感覺遲緩。即使應用以90Hz顯示幀,這種遲緩也會導致用戶感到疲勞。我們正在不斷調整Medium的操作,希望儘可能提高其處理速度,但沒必要追求非同步操作在10毫秒的框架內完成。
3。 總結
這是關於Move Tool系列文章的最後一篇博文。在整個系列中,我們介紹了如何使用Touch控制器創建位移場;我們是如何將位移場應用於3D對象;討論我們創建的三個原型;Medium是如何將三角網格轉換為有向距離場(signed distance field,SDF),而這將如何為其他類型的雕刻操作提供幫助;以及如何非同步安排對性能要求巨大的操作。
我們希望這是有用的信息,可以幫助你設計和開發自己的VR應用程序。
來源:映維
TAG:砍柴網 |