有了客戶端的無限大地圖,服務器端也可以做做嘗試了,服務器比客戶端單純了很多,不用做裁減等復雜的計算工作,但是要維護大量的信息通訊,最棘手的問題就是,如何讓“身邊”其他玩家知道你在哪里,player數量那么巨大,如果所有的player的狀態通知所有的人那就是n的n次方的通訊,可以看來這樣的通訊方式是完全不合理的,所以如何確定“身邊”這個概念就至關重要了。
有了客戶端無限大地圖的實現,這個思路就豁然開朗了,有個圖例:

把服務器打上格子,把整個地形來個定義
定義為 blocks_Tx_Ty_Bx_By
Tx Ty 代表的是 Tile的第幾行第幾列
Bx By 代表的是該Tile下Block的第幾行第幾列
把每個block的范圍給筐定,這個可以事先計算出來的,很簡單
人物一旦發生了移動就會發出udp的信號,服務器改變每個人物所在的位置
那么客戶端的Role(玩家所操縱的角色)最關心的是周圍9個tile里面活動的其他玩家的信息
因為客戶端要進行視錐剪裁,
反過來說,角色A移動了,就要通知周圍9個tile里面所有的角色,你當前的位置
另外,移動的時候還要看你所在的block發生了改變沒有,如果發生了改變,這個信息也要發出去
那么客戶端可以更新所觀測的角色所在的block,這樣客戶端的tile作culling和rending以及collising的時候就方便了
客戶端要作的只是簡單的terrain.AddSenceModel 和 terrain.RemoveSenceModel就能動態更新block中的角色模型了
一個block好歹也有33x33,被觀測對象只有block改變了才會做(terrain.AddSenceModel 和 terrain.RemoveSenceModel)這樣的操作
這樣的操作應該不會特別頻繁,客戶端應該開銷的起
客戶端,應該存在一個可觀測的9個tile的rolelist,每次發過來的其他玩家的udp positionpack還是要作即時更新的。
目前根據這個思路我就要開展工作了,效率是至關重要的。
按照這個工作實現了再來測試效率,預計本周之內搞定角色之間位置信息的相互通訊。
激動人心的時刻就要到來了。。。。。。
目前只是嘗試,更多的細節和感受我會逐步發放上來。