2012-07-07 44 views
0

我正在基於我的世界的基於java的LWJGL遊戲。我正在努力進行地形管理,因爲世界可以隨着您的探索而擴展。如果將地形存儲在塊對象中,並且您需要知道要從渲染列表中刪除哪些塊,要添加哪些塊以及根據玩家的xyz位置生成哪些塊,您將如何管理地形?在基於體素的遊戲中的塊管理

+0

哪一部分導致您的問題?事實上,這個問題似乎過於寬泛。 – biziclop 2012-07-07 16:27:31

+0

讓我難以接受的部分是如何以一種方式存儲塊,以便您可以輕鬆判斷它們是否已渲染,並在距離較遠時將其移除,或者在距離較近時將其添加。這很難做到,因爲你無法真正將數組用於無限的世界,並且Arraylist很難找出索引中的哪個塊到達哪個xyz位置。 – Mad3ngineer 2012-07-07 16:51:51

+0

我現在回來了,我明白了......我被擊倒的原因是我很擔心表演。 – Mad3ngineer 2012-10-20 19:33:53

回答

3

我使用高分辨率的醫學體素數據並使用八叉樹以高效的方式進行存儲。

你不能真正使用八叉樹,因爲你想要動態擴展地形(八叉樹在查找時極其快速,但在構建/擴展時速度非常慢)。

我建議你嘗試使用HashMap,如果你爲Vector3提供了一個好的散列函數,那麼對於任何數量的塊(理論上O(1))來說,查找時間將幾乎相同,但這只是最好的情況。 )。

然後,您可以通過遍歷映射鍵來移除所有看不見的映射條目(這可以在處理所有加載/卸載的輔助線程上完成)。

希望這有助於

〜洛基

+0

感謝您的回答! – Mad3ngineer 2012-09-20 20:26:49

+0

我發現最好的辦法是將每個世界部分分割開來,這樣一個塊有一個'16x16x16'塊,然後一個區域有一個'16x16x16'塊,然後這個世界可以有一個' 117188x1x117188'區域,每個羅盤方向總共有'30000128'個區塊(類似於我的世界)。我正在做的遊戲的陣列大小略有不同,但概念是一樣的。 – 2015-09-24 16:38:10

+0

而當我說數組的意思是'Block [] [] [] blocks = new Block [16] [16] [16];',而不是散列表或數組列表;因爲我已經嘗試過這些,並且它們似乎比傳統的三維陣列慢得多。 – 2015-09-24 16:39:18