1. 程式人生 > 其它 >03.How to Build a Game World

03.How to Build a Game World

what does a game world consist of?

 

 

 

 

 

 

 

 

How should we describe a drone?

如何去描述一類物體:屬性和行為

 

 

 

 自然而然想到了繼承與派生,面向物件

 

 但隨之GO種類膨脹,界限變得不清晰

 

 元件化思想:

 

 

在一個GO裡面可以管理它所有的component

注意到每個函式都有tick函式

 

 

How to make the world alive?

 

 go裡面的component依次tick一次

 

 

但是更好的方法是每個元件系統tick一次,而不是每個object,更符合現在工業pipeline的概念。

把所有同一個系統的資料一起處理就是一次批處理

How to explode an ammo in a game?(如何讓GO彼此之間互動?)

 

 讓go不停做判斷,與其互動的型別是什麼然後再做事,not good!

事件機制:讓GO之間解耦合。可擴充套件的事件機制很重要。

How to manage Game Objects?

 

 

1.遍歷場景中的物體判斷是否互動,那麼就是O(n^2)的複雜度,not good!

2.平均劃分,缺點,實際上地圖內容分佈是不均勻的,在不活躍地區分配等量的資源無疑是浪費的

3.hirerarchy劃分,二叉樹,四叉樹,八叉樹,BVH......

 

 

 

 

spatial division是scene management的核心

GO管理更復雜的情況:

 

 

-比如上車後,人物就繫結在了車上,車的位移是否帶動了人物的位移?

-如果元件之間有迴圈依賴,很容易產生lag。

-GO之間直接通訊,會產生ambiguity。我們再加一個“郵局”來處理GO之間的通訊,保證時序的一致性,比如pretick,tick,posttick函式。

-比如,精彩回放,並不是把遊戲過程錄下來。只記下了玩家的輸入,把遊戲重新模擬了一遍,如果遊戲系統是有確定性,一致性的,模擬結果肯定與先前一樣。

-如果tick時間過長的話,很多種策略:只能繼續算完,直接跳過後續幀,計算步長來補償,但最好還是優化演算法,比如將一幀事情分成很多幀。

-tick的時候渲染執行緒,邏輯執行緒如何同步?logic一般會比render提前,不然會導致玩家輸入輸出延遲。

-一般會提供幾種空間劃分的方法,具體場景或遊戲型別不同來選擇。