饭中淹的避难所~~~~~

偶尔来避难的地方~

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  94 随笔 :: 0 文章 :: 257 评论 :: 0 Trackbacks

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

posted on 2008-04-20 02:14 饭中淹 阅读(1457) 评论(1)  编辑 收藏 引用

评论

# re: 尘封的卷轴(1) - 早期的基于格子的MMORPG服务器角色间可见性处理的想法 2008-10-14 16:54 路人
不错~  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理