欢迎来到天天文库
浏览记录
ID:21897664
大小:1.29 MB
页数:31页
时间:2018-10-20
《网游服务器端寻路》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、网游服务器端寻路面向多核、分布式2008-12金山软件陈杰bitcowboy@gmail.comNPC寻路问题很重要(虽然也可以不要)游戏玩法与NPC的寻路能力直接相关计算量很大数据结构和算法的相对复杂一台服务器上数万个NPC一起寻路有挑战寻路与其它模块的关系寻路在游戏中是一个相对底层的模块NPC的AI系统依赖于一个可靠的寻路算法寻路模块依赖于游戏对地图的描述寻路模块基本上是一种服务模块,总是被调用,但是自己不需要主动去做什么事情寻路的一种实现在游戏逻辑服务器内实现一个Astar算法,在逻辑地图描述数据上(CEL
2、L)搜索。效率很低可能会阻塞主循环增加服务器复杂度目标NeedforSpeed!将性能提升100倍!在单位时间内出更多的结果不能影响游戏逻辑的主循环更好的利用多核,甚至多台计算机的运算能力如何在逻辑很复杂,数据结构很复杂,为了提高效率而指针满天飞的情况下,让服务器跑稳定?如何更方便的在游戏运营过程中逐步改进巡逻模块?改进地图描述数据Cell结构适合描述逻辑数据:Trap,Obstacle…但是Cell的数量太大,直接用来AStar效率很低在NPC大多数时候不需要跳跃、游泳、空中飞行的时候,可以是用NavMesh来
3、描述寻路所需要的地图障碍信息NavMesh使用凸多边形来描述可以移动的区域,数量通常只有CELL的几十分之一到数百分之一将寻路模块独立为进程为什么要独立出去?不必担心阻塞游戏服务器的主循环。不论是主服务器还是寻路模块,都变得更简单一些。为什么是进程而不是线程?寻路模块使用自己的地图描述数据,和其他逻辑模块没有太多需要共享的资源。更健壮。寻路模块本身没有状态,也没有不能丢失的动态数据。即使寻路模块挂了,也不会影响游戏的主服务器。直接重启就可以了。寻路服务器减少重复计算AI的行为会经常周期性的调用寻路。附近有很多NP
4、C,他们的坐标很接近,寻路的计算是很相似,或者完全相同的。如果将寻路的计算结果缓存起来,就可以减少重复运算。游戏服务器组每个逻辑服务器独享寻路服务器一份地图的NavMesh数据需要加载到多个寻路服务进程中,浪费宝贵的内存。每个寻路进程单独Cache寻路结果,使得寻路Cache中的数据重复,命中次数下降。对于硬件需求过高。一般不可能做到每台寻路服务器都在独立的物理服务器上。共享寻路服务器的游戏服务器组一台物理服务器上共享数据在不考虑地形(障碍)动态变化的情况下,NavMesh的数据是静态的。所有寻路进程可以同时读取
5、共享数据。但是Cache是动态刷新的。必须考虑进程间的同步问题。考虑加锁对Cache进行加锁寻路算法每搜索一块区域时都要获取锁,然后判断Cache里是否有可以利用的数据。当寻路出新的路径时也要获取锁,并将计算结果写入Cache中。寻路过程中总是在获取锁,等于单进程跑。读写锁寻路过程中可以明确区分读写两个阶段寻路过程中,获取读锁来获取Cache数据。寻路结束后,获取写锁来更新Cache数据。多个进程可以同时读Cache,但是如果有进程要写Cache的话,所有进程都要等。利用本地Cache提高并发能力为每个进程增加一
6、个本地的私有Cache。寻路进程算出结果后只将寻路结果更新到本地的Cache。而不是立刻去写共享的Cache。等一段时间之后,进程再一次性讲本地Cache的内容提交到共享Cache。降低了进程获取共享Cache写锁的频率,从而提高并发能力。带本地Cache的寻路进程锁的问题锁的目的就是让程序变得不并行。锁本身的代价很高,特别是进程之间的锁,往往需要使用操作系统内核对象来实现,获取和释放的开销通常在1000CPUTick左右。锁很不安全,只有有一初代码没有按规矩来获取或者释放锁,整个系统都会出问题。利用调度算法避免
7、锁引入一个调度进程。所有寻路进程的任务由调度进程分配。所有寻路进程完成寻路任务的时候向调度进程汇报。调度进程没有分配任务的时候,寻路进程不能访问共享Cache(读/写都不行)。调度进程可以在没有进程访问共享Cache的时候向一个进程分配更新共享Cache的任务。调度进程通过调度来实现互斥调度进程会周期性的控制寻路进程向共享Cache中更新数据。再此之前,调度程序会保证所有的寻路进程都是等待状态。再此期间,调度程序不会向任何寻路进程发出新的寻路任务。调度对寻路效率的影响调度本身做的事情很简单,开销相对于寻路算法而言
8、可以忽略不计。由于每个寻路进程有本地Cache,所以调度算法应该将同一个地图并且坐标相近的寻路任务尽量分配给同一个寻路进程。调度控制寻路进程将本地Cache提交到共享Cache的频率会影响整个系统的效率。频率太低的话,共享Cache中有效数据就少。频率太高的话,不管用不用锁写操作是互斥的。需要避免的问题如果调度器分配一个任务给寻路进程,但是寻路进程出错,而一直没有给调度进
此文档下载收益归作者所有