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

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