一.问题概述
1.1 、背景介绍
在大型多人在线游戏(MMOG)中,一个玩家视野范围通常是有限的,即只能看到附近一定范围内的对象及其行为,同时也并不需要感知到足够远处对象的存在,实际上这与现实世界中的普遍规律也是比较的一致。
对于视野逻辑的实现,除了距离上的这个限制,一般也还会有一个数量上限,即一个玩家同时能看到的对象个数是有限的。这样做的主要目的,是为了在玩家过于密集时,使消息广播量得到有效的控制。
基于以上两点考虑,通常的实现是在玩家身上维护一个视野列表,并在自身及周围对象位置变化时进行更新。在《自由幻想》、《幻想世界》、《QQ仙侠传》等多款游戏中,都有类似的实现。
不是吧阿sir既然视野列表长度是有限的,当玩家过于密集时,就需要一个进入视野列表的优先级策略,这样才能够使游戏中玩家的视野逻辑尽量地接近自然、真实的情况。本文将会详细介绍一下在《QQ仙侠传》中,Server端在视野列表以及优先级控制方面的具体实现。
1.2、优先级策略科技让生活更美好作文600字六年级
仙侠传中主要采用了两个优先策略:
1)特殊关系优先
在现实世界中,拥有特殊关系的人们总是会更多地关注彼此,游戏世界也是如此。
可见范围内特殊关系玩家会优先进入视野,以便他们之间更多关注和交互。
在仙侠传中,目前考虑的特殊关系仅包括队友和夫妻,即联系密切的小规模团体。
丽江旅游介绍2)距离近者优先
可见范围内,距离较近的玩家,会被优先看到,这也是一种比较自然直观的策略。
仙侠传较早的视野算法并没有按距离优先,经常出现的情况是两个玩家约定交易地点,但跑到相同位置后确无法互相看到。距离优先策略可以很好地解决类似问题。
二.相关数据结构
2.1、视野列表
实际上NPC、怪物的分布及行为都是可受Server控制的,设计上可以规避分布过于密集的情况;玩家的行为才是无法控制和准确预期的,因此仙侠中仅针对玩家采用了视野列表的管理方式,后续文中的“
视野列表”也是指“视野内的玩家列表”,不再重复说明。
仙侠传中目前的视野列表长度为60,数据结构使用定长数组,每个元素记录玩家对象的ID。考虑到仙侠传中ID是64位的,且视野列表会频繁的变动,我们并不保持列表的有序性,以此降低增删结点时带来的数据挪动。
blue什么意思同时视野列表应该具有对称性,即A和B两个玩家,或者互相都能看到,或者互相都看不到。这样主要是出于设计上的考虑,避免出现类似PK上的不公平的情况。
仙侠视野列表的特点可以概括为:有限性,对称性,无序性。
2.2、地图对象管理
为了展开视野优先级策略的思路介绍,首先简单介绍一下仙侠传地图对象的管理方式。仙侠传中将地图划分成格子单元Cell,每个Cell边长是32米,每个玩家的视野范围是以自身为中心的5×5格子方阵。地图中的对象由Cell进行管理,在Cell中串接成链表,这样就可以快速遍历到视野范围内的所有对象。下图2-1给出了一个比较直观的描述。
图2-1  地图Cell管理
玩家视野的距离限制,本质上我们是通过Cell方阵来确定的;如果区域内玩家足够密集,我们则按优先级策略进行取舍,得出合适的视野列表,以此达到对视野目标个数的限制。下面我们就来介绍一下仙侠传视野搜索算法的具体思路。
三.视野搜索算法思路
鱼丸子的做法3.1、视野搜索主要步骤
视野搜索的主要步骤如下:
1)  基于当前位置,按照优先级策略,得出完整的视野列表;
2)  对比之前已有视野,归结出视野变化;包括离开视野列表、新进入视野列表,保持不变列表;
3)  对离开视野的玩家做相互删除操作,并互相通知;
我相信 歌词
4)  对新进入视野的玩家做同步增加操作,若对方视野已满,则可能会进行替换;
在具体实现中,通常有两种事件会触发进行视野搜索:一个是新进入地图时刻,如角登录或地图间传送;另一个是当玩家的位置发生足够的变化时,如玩家移动了较远的距离。
对于玩家移动距离的判断,我们采用了类似Cell划分的思路,将地图划分成了更小的格子,如果移动前后玩家处于不同的格子中,则认为发生了足够的位移并重新进行视野搜索。
下面我们来看一下视野搜索中比较关键的部分,即得出带优先级的完整视野列表,在仙侠中是如何来做的。
3.2、计算完整列表
首先声明原有视野列表为:CurrList = { a, b, c, d …}
为实现玩家收集过程中的分级,我们定义多个收集队列,初始为空:
特殊关系:      ColtList[0] = { }