游戏开发笔记(十)——移动功能设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mooke/article/details/50822111

除了少数解谜类游戏,移动功能似乎已经成了当下游戏的一种居家旅行必备。

简单移动功能类似贪吃蛇、俄罗斯方块、打砖块之类的游戏,移动可能仅仅意味着在代码里OnUpdate时改改坐标,在OnDraw时再画出来。

但对于MMORPG来说,移动成为了一个复杂的问题。

具体的说,它常常意味着以下一系列问题:
+ 寻路
+ 延时下的移动体验
+ 表现同步的一致性
+ 位置校验方案
+ 服务器性能压力
+ 自动回避(防重叠)

当然现在市场上还做mmorpg的已经比较少了,而手游产品大多以单机玩法为主,甚至很多游戏的主城都是单人场景,这种情况下移动基本上客户端简单处理服务器稍加检查就可以了。

但对于MMORPG来说,至今仍然纠结于这些问题,并没有特别成熟一致的解决方案出现。这里也只是分点对这些地方稍作讨论,并不能给出比较终极的结论或者方案。

寻路

寻路顾名思义就是游戏中为了指引角色从地图一点到另外一点的最短移动路线进行的计算过程。

由于直接基于像素点计算超出了目前硬件水平能够接受的范围,能够适用于像素点寻路的算法非常至少,用途也有所局限。所以对于大多数游戏而言,为了计算的便利,通常都是要把像素点收束为一个个格子的,这样虽然降低了精度,但大大提高了计算的可行性。

由于本质上是一种搜索算法,并且可以视作图的一种,所以大多搜索算法和一些图算法都适用于寻路的场合,但综合来说,兼顾效率和通用性,游戏领域用的最广泛的寻路算法是A Star。

此外由于游戏场景的不同,WayPoint(路点寻路)、NavMesh(导航网格)、IDA Star(迭代加深的AStar搜索)也常常加入进来组合使用。

A Star在游戏中应用本身也有很多局限性,比如CPU和内存代价高昂,不适合服务器频繁使用,也不适合大型地图长距离寻路等。因此,游戏中还需要寻找一些优化手段针对不同的情况解决问题。

这里也顺便安利一种我见过的比较适合处理大型地图长距离寻路的算法:

HPAStar:http://webdocs.cs.ualberta.ca/~kulchits/Jonathan_Testing/publications/ai_publications/jogd.pdf

计算嘛,可以取巧,但总体上没有捷径可走,优化的思路大同小异,运行时的效率榨干了就开始打预处理的注意。随着Unity3D的普及,目前NavMesh作为内置功能,已经成为了一种更加普遍的寻路方案了。

由于网上对寻路已经有非常多专业的讨论了,这里也就不展开。

延时下的移动体验

由于mmo强调实时交互,所以一点点的网络延时都可能会直接反馈到玩家体验上。

所以对于移动这样频繁的操作来说,一般是需要采取一些措施把延时巧妙的掩饰起来的。

常见的做法比如客户的请求发出后延迟一点点时间(比如100ms)就开始动(可以利用角色起步动作等进行掩盖),使得服务器和客户保持一个更加近似的位置上,这样释放一些技能的时候尽可能减少因为移动导致的等待时间或者拉扯的情况产生。

还有的比如更多依赖客户的移动,服务端给一个更大的位置误差容忍范围,以此保障客户的的移动时绝对流畅。但这在玩家数据同步的过程中更容易一些小问题,还有在一些位置相关的技能释放的时候,会留下一点点的作弊空间。

客户的请求发出后等服务器回包再按照服务器的指引来移动看起来比较安全可靠,但是体验太差,一般没有游戏会这么做。

表现同步的一致性

比较容易出现表现差异的地方主要有2个。

一个是玩家频繁改变移动路径的情况,由于前后端的位置差异,服务器需要“脑补”一条和客户端稍有差异的新路径出来同步给其他人;另一个是玩家释放技能时,由于操作者客户端和服务器有位置误差,多个客户端看到的释放技能的位置可能有所不同,在一些对位置敏感的场合,可能会引起一些意想不到的麻烦。

这个似乎目前为止都没有特别有效的办法,这种为了照顾客户端体验而一定程度上导致本客户的上其他玩家行为怪异的事情怎么说呢…通常是需要反复去调节一下参数以求整体表现良好的平衡艺术吧。

位置校验方案

前面也说了为了照顾客户端体验经常是需要服务器适当放宽校验范围的,更进一步来说,这里要在一定程度上防作弊的前提下,尽可能的照顾客户端表现。

一般是定一个网络延时的范围,尽可能的满足这个延时范围内的玩家位置误差不采取强制措施。根据这个延时计算出服务器最大可能面临的坐标差值,作为校验范围,对于超过的玩家只能说句对不起把他拉回来了,不然任他胡作非为其他客户端的人看到也是要乱套了。

服务器性能压力

由于玩家自身的寻路基本都由客户端完成计算,直接把结果发给服务端了,服务器性能压力在移动方面主要就体现在NPC的寻路处理上了。

对于这个问题一般有以下一些措施:
+ 首先在玩法上就尽量避免制作大量大范围寻路的Npc
+ Npc寻路限制寻路步数(超出步长则放弃寻路,乖乖调头回阵地)
+ 追击时(目标位置不断变化)组合使用多种寻路算法,避免频繁使用代价高昂的寻路算法计算路线

自动回避

目前比较流行的自动回避算法一般都是基于“场”的概念的,比如RVO、流场寻路(只是听说,不了解机制)等,关于RVO这里有一些简单介绍:http://gad.qq.com/article/detail/7687

如果只是在追击的场合下处理NPC自动错开的问题,则还有一些别的方法,有的思路和“场”有还相似之处,比如说有一种以追击目标为中心,自动模拟出一个圆来,各个npc的追击目的地以某种规则分布到这个圆上。还有硬派一点的做法,比如说每个NPC视为一种动态障碍物,全程依靠寻路自动进行回避。

当然此外还可以依靠更加纯粹的客户端技术来处理碰撞问题,不再一一列举。

总结

本篇简单介绍了mmo中处理移动会涉及的一些问题和一般性的解决思路,由于其中一些问题自己并没有亲手料理过,再加上也已经比较久没有在前线直接处理移动问题了,所以这些话题并没有展开来探讨细节。另外我在找素材的过程中发现,实际上大部分经典的细节问题都已经有相应的文章有过讨论了,这里就当是帮这些大神们做做摘要吧。

没有更多推荐了,返回首页