當前位置:
首頁 > 科技 > 開發實踐:Darkwind Media用遮擋剔除帶來更高性能Oculus Go遊戲

開發實踐:Darkwind Media用遮擋剔除帶來更高性能Oculus Go遊戲

查看引用和消息源請點擊:映維網

本文來自Darkwind Media

映維網 2019年06月06日)Darkwind Media為Gear VR和Oculus Go用戶帶來了開發團隊的《Republique》。為提高遊戲的性能,團隊探索了每一條可能的途徑,而他們指出最好用的方法是遮擋剔除。Darkwind Media日前撰文介紹他們開發的定製遮擋剔除解決方案,同時解釋了在這一過程中所學習到的經驗教訓。以下是映維網的具體整理:

1. 擴展系統

我們一開始是從單點進行捕獲,所以我們必須考慮camera移動時的情況。我們需要一個能夠有效從一個可見集合轉換到另一集合的系統。在《Republique》最後的一個場景中,玩家可以通過一架沿著固定軌道移動的無人機來感知世界,而camera運動基本是1D而非2D或3D。這使得我們能夠擴展遮擋剔除並支持一定的camera運動。

對於支持一個移動camera,第一種同時是最天真的方法是沿著1D路徑選擇幾個點,並根據這些點捕獲遮擋。但如果camera最終停留於這兩個點之間呢?通常來說,捕獲之間的距離越短,潛在可見集合發生變化的可能性越小。為了縮短它們之間的距離,有人可能會在1D路徑中包含大量的捕獲點。遺憾的是,這最終會佔用更多的內存,並且每次camera移動時都需要遍歷整個list的渲染器。

如果我們將捕獲點整合到單個卷積中呢?考慮到兩個相鄰的捕獲形成一個線段,如果沒有進行另一次捕獲,我們無法確切地知道渲染器被遮擋的位置,但如果我們為每個線段執行這項操作,我們最終是進行了無限次的捕獲。

最安全的假設是,只要camera位於這兩個點之間,任何一個捕獲所看到的渲染器都可能屬於可見。我們對下一個線段和下下一個線段執行相同操作,依此類推。請注意,單個捕獲與它所連接的兩個線段共用,因此當camera正好位於捕獲位置時,我們可以選擇使用任一線段進行剔除,並保證啟用該點捕獲的每個渲染器。

…因為我們追求的正是通過這些卷積的運動,所以如果我們只存儲前一個單元格的變化,而不是說為每個卷積儲存整個list呢?我們需要兩個list:一個用於打開渲染器,一個用於渲染渲染器關閉。當向相反方向移動時,則反過來解釋list。關閉list中的渲染器應該打開,打開list中的渲染器應該關閉。

當從單元格A越過單元格B越時,渲染器打開list屬於B的可見性集合中的所有渲染器集合,但不是A的集合。這被稱為B中A的相對補集。

你可以看到,這種開關差異list的編碼方式可能比整個list小很多,特別是在具有數百個或數千個渲染器和多於四個單元的真實場景中。它同時可以大大減少因進行大量捕獲而造成的內存損失。捕獲越接近,它們就越有可能看到同一組對象,因此這種差異list越有可能只是很小,甚至為空。

也許更重要的是,如果我們記住我們佔用了前一幀的那個單元格,即便camera移出該幀內的所述單元格,它離所述單元格的距離都不會太遠,而我們只需要迭代數個差異list來更新遮擋剔除即可。構建一個簡單的1D遮擋系統就是這麼簡單。

現在我們已經有了一個有效的1D遮擋剔除系統,所以我們不難看到系統可以擴展到2D,甚至3D。要從1D擴展到2D,你可以從捕獲點網格開始,並將其中的四個整合成一個矩形單元格。每個2D單元將具有四個鄰居,因此具有四組差異list。要擴展到3D,你可以從捕獲點的3D網格開始,並將其中的八個組合成矩形稜柱單元格。每個3D單元將具有六個鄰居,因此具有六組差異list。

儘管其他版本的《Republique》都沒有採用這樣的系統,但如果你的遊戲是針對六自由度頭顯,你可能需要2D或3D遮擋剔除。

2. 經驗教訓

每個解決方案都存在一定的權衡折中,我們的解決方案也不例外。在考慮是否應該採用我們的解決方案時,下面是你必須注意的問題:

2.1 捕獲解析度

我們為遊戲的大部分場景選擇了512px的捕獲大小,因為我們發現這是精度和計算時間之間可接受的權衡。理論上,為了獲得完美的精度,你應該以接近於屏幕顯示捕獲的解析度來捕獲遊戲世界。Gear VR和Go的默認眼睛緩衝區大小為1024px,視場大約為90度。另一方面,如果512px丟失了一定的渲染器,則最終圖像中的寬度必須僅為1到4像素,並且在所述大小下,它們容易產生鋸齒。如果你的渲染器不是太小,或者你只是想要剔除小對象,選擇512px這樣的低解析度可能也沒有太大問題。

2.2 靜態集合和複雜世界狀態

在我們的系統中,我們只能遮擋在捕獲過程中不會移動的靜態網格對象。同樣,我們只是遮擋了一個世界狀態。如果你的世界有多個具有不同渲染器的不同狀態,你將不得不進行更多的捕獲,從而遮擋其他狀態。

2.3 與其他可見性系統的兼容性問題

遊戲系統控制部分網格的可見性。在這種情況下,你要麼通過剔除排除這些渲染器,要麼實現其他邏輯來組合兩種形式的可見性。例如,LODGroup控制渲染器的可見性,而你可以設置成僅LOD0能夠遮擋(如Unity)或將每個LOD層次視為單獨的世界狀態。

2.4 更高的內存消耗

將這個遮擋數據存儲在內存中,特別是以上面最為天真的方式,這確實佔用了內存空間和載入時間。所以請確保你有額外的內存。

2.5 分層剔除

在《Republique》中,這種精細的剔除僅僅是較粗糙房間和區域分區之上的最後一層。這加快了應用程序在camera轉換期間的剔除數據,因為沒有觸及所述區域中的每一個渲染器,只是當前camera所需的渲染器。即使從絕對意義上來說這樣的節省很少,但如果沒有它們,在遊戲過程中快速連續地出現camera切換可能會令情況更加糟糕。

2.6 重新讀寫遮擋數據

當靜態渲染器以任何方式發生改變時,遮擋數據將會變得過時並可能導致視覺錯誤。因此,需要在修改場景時重新計算遮擋,並且根據你的自動化程度,它可能會減慢你的工作流程。

2.7 實時陰影投射

如果你有任何類型的實時陰影,請注意:本系統剔除的對象無法投射實時陰影。所以請使用諸如烘焙這樣的替代方案。

2.8 優化讀寫過程

GPU渲染彩色場景的速度非常快,但CPU一次性讀取所有6×512×512像素要慢得多。下面是你可以採取的措施示例:

將任務拆分為線程

使用計算成本更低的hashcode

緩存數據結構並以合理的大小初始化它們

……

例如,《Republique》可以在不到25秒的時間內處理髮電廠區域(需要385個立方體貼圖)。

2.9 三自由度頭部運動

我們只計算了單點的可見性。三自由度VR不允許用戶在虛擬世界中進行物理移動,但Oculus Go和Gear VR會嘗試根據頭顯方向預測用戶的頭部和頸部移動了多少,這確實給遊戲camera一點點的運動。我們之前說過,在幾厘米內沒有太大影響,但如果camera非常接近角落,傾斜頭部可能會產生非常大的影響。

我們可以將camera的位置稍微移離角落,或者掠過角落的邊緣,這樣捕獲就可以看到周圍,並且對象永遠不會被剔除。

感謝你的閱讀。當你優化遊戲的性能時,我們希望本文能夠給你帶來啟發。祝你好運。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 映維VR 的精彩文章:

豪威科技亮相AR/VR眼動追蹤、面部識別近紅外感測器OVM7251
英特爾發布10納米第十代酷睿CPU,集顯性能翻倍,WiFi-6無線速度提高3倍

TAG:映維VR |