(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)- 后记
这个方法作一些优化和修改,还是很实用的方法。最后给它命个名吧,就叫 螺旋网格 吧。