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提前,不然會導致玩家輸入輸出延遲。
-一般會提供幾種空間劃分的方法,具體場景或遊戲型別不同來選擇。