被芯被套:尘封的卷轴(1) - 早期的基于格子的MMORPG服务器角色间可见性处理的想法-游戏开发

来源:百度文库 编辑:九乡新闻网 时间:2024/05/06 01:38:45

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

来自:http://www.cppblog.com/johndragon/archive/2008/04/20/47644.html

(1)- 工作原理
      这个方法,需要先把地图分成很多个区域,区域大小,一般为可视距离 x 可视距离 那么大的一个正方形区域。
      然后,从主角所在的这个区域开始,他的所有动作都广播给他所在和他所在周围的总共9个区域(或者更多更细)里的角色。同时他能够看到这些区域内的角色,并接收到他们得动作信息。
      每次主角从一个区域移动到另一个区域内的时候,会丢失掉几个区域的角色的可见信息,而获得到几个新的区域的角色的可见信息,而且丢失和获得的区域数应该是相等的(包括空的,没有东西的区域)。
      图示:
            

(2)- 适用范围
      这种方式的可见性处理方法一般多用于自由行走的各种MMORPG中,3D的居多。

(3)- 优缺点
      。。。。各位自己总结吧,这个方法简单实用,比较推荐使用。就是跳跃性比较大,不过可以用缩小区域大小,增加可见区域的数量来解决(最后的极端就是完全格子化)。

前文回顾:
尘封的卷轴(1) - 早期的基于格子的MMORPG服务器角色间可见性处理的想法

来自:http://www.cppblog.com/johndragon/archive/2008/04/20/47645.html