(1)- 歷史
六年前,我剛剛踏入網絡游戲開發這個新奇的領域,在完全沒有經驗的情況下,產生了不少亂七八糟的想法。寫下這些隨筆,只是為了保存下這份記憶。這些方法有些幼稚不堪,有些很無厘頭,雖然用處不大,不過寫出來,可能會對有些人有點作用吧。
(2)- 要解決的問題
因為是網絡MMORPG游戲,所以需要將一個角色的動作告訴周圍他看到的,也是能看到他其他角色知道。這個方法,就是用來解決將動作告訴其他角色知道這個問題的。
(3)- 工作原理
這個想法的工作原理,包括以下幾個要點:
A,每個角色從他站得位置開始,螺旋形的遍歷所有格子,直到遍歷夠 M x N 大小的網格,或者找到滿 X 個可視角色之后,將這 X 個可視角色的信息(一般是對象指針,或者ID)緩存到這個角色的服務器對象中。
B,當一個動作產生的時候,遍歷這 X 個其他可視角色的緩存,把這個動作告訴他們(發送網絡封包給他們對應的客戶端)。
C,每過一段時間,重復執行下A操作,并向從原來的緩存中清理出去的角色發送自己消失的動作,向新加入到緩存中的角色發送自己出現的動作。
對螺旋形的遍歷不太明白的朋友,可以參考下面的圖示

角色站在1號位置,沿著數字依次遍歷周圍的格子。這樣做是為了保證越靠近角色本身的可視物件擁有越高的優先級。
(4)- 優點和缺點
這個方法的優點還是有的,我總結了下,有以下幾點:
A,穩定性高,搜索的范圍固定,而且最大可視數量固定,所以基本保證穩定,不會出現太大的跳躍。
B,自動化程度高(^_^),算法自動對周圍人多的情況進行了處理,自動縮小范圍,既不會丟失靠近自己的人的重要信息,也不會因為人多而影響效率。(看起來有點象3D渲染上用霧遮擋來減少繪制的多變形數量)并且自動進行了動作LOD,因為是每過一段時間進行一次遍歷,所以在這段時間內如果有其他角色頻繁在遍歷邊緣做進出的動作,都不會向角色發送任何信息。
缺點也不少:
A,遍歷的時機無法控制,不能在有角色進入視野的時候主動去遍歷,缺少主動性。
B,需要一定的空間來存儲周圍角色的信息(指針,ID等)。
C,當周圍可視角色比較多時,可視范圍就小了,會導致一些重要信息無法及時獲知。
(5)- 后記
這個方法作一些優化和修改,還是很實用的方法。最后給它命個名吧,就叫 螺旋網格 吧。