魏韬:谈谈MOBA类游戏的客户端开发

魏韬

资深客户端工程师,参与及负责过的项目包括《斗战神魔谱》、《全民飞机大战》、《红雀》、《红雀2》、《超级战场》、《传说对决》等。

本期Live,我们邀请到了从业时间9年,参与及负责过的项目包括《斗战神魔谱》、《全民飞机大战》、《红雀》、《红雀2》、《超级战场》、《传说对决》等游戏项目的资深客户端工程师魏韬,从MOBA类游戏的设计角度分享游戏客户端的优化技巧、客户端与服务器的优化同步等问题,以下是Live的整理内容。

Q:要实现安卓跟iOS都可以热更新, 是不是游戏里的所有要更新的逻辑都要用lua去实现?(例如包括:状态机,缓存机制等功能)

魏韬:就我观察到的情况,目前确是这么个现状。因为在iOS上面,大家都知道iOS APP禁止热更这方面的修改的,而Android这边是可以做一个DLL的热更出去的,一般有两种方法,一种就是把Mono加载DLL的地方修改下,另一种就是把逻辑全部做成另一个DLL,通过游戏运行过程中的一个脚本去读取和调取这个DLL,这样就可以做到热更新。但是如果需要iOS和Android的逻辑都可以热更新的话就比较好的选择就是lua。

Q:DLL是用C#做好还是用C++做好?

魏韬:这个主要还是取决于你这个DLL是来做什么的,举个例子来说, C++和C#都可以做出那种中间语言的DLL。所以说并没用C#做好还是用C++做好这个说法,如果说是对引擎的修改肯定是用C++比较好,针对那些逻辑的DLL肯定是C#比较好。当然从性能方面来说的话,如果你的游戏有个很独立的模块需要极限的性能,那当然是把这个部分做成个native的库是最好的。

Q:请问,游戏内数据和状态怎么和服务器保持同步的,能大概讲下帧同步和状态同步的概念吗?

魏韬:帧同步服务器的事情是非常的少的,每个客户端生成自己想要执行的指令,服务器搜集并广播指令并标记上帧号,所有客户端接收每一帧的全部指令并运算出相同的结果,注意这个地方一般有两种实现,一种服务器要求接收到每一个客户端的帧执行完成消息才发送执行下一帧的命令,而另一种的话服务器更像是一个CPU只是负责节拍,如果有个客户端没有赶上某一帧的操作搜集,那就当他是没有操作处理了。MOBA类的帧同步的其实就是这个阉割版的帧同步,服务器只是负责一个通知的作用,并不会管哪个客户端卡了还是出状况等问题。而状态同步的话是服务器负责计算结果,客户端负责展现。

Q:还有游戏内的技能命中,碰撞的计算是在前端算还是服务端算的?

魏韬:这个主要还是取决与你的游戏架构,如果你是服务器运算的话客户端可能只是展示那些数据。如果是帧同步的话那就是客户端自行计算。

Q:大场景3D,有大量的植被(草皮、树木、石头),如何做到效果好,性能占用低?

魏韬:对于大量场景3D资源化就要做到资源初始异步化,并且要提前初始化,对于对象的移动,不需要重新的创建,进行坐标的改变就可以达到所需要的效果。对象池的管理的话可以使用完全的预加载,如果不能的话,就需要充分运用异步初始话资源来降低性能的占用。

Q:游戏中的战争迷雾是怎么实现的?

魏韬:说简单点,以整个地图为基准左下角到右上角,视为一个黑色的贴图。根据视野的信息,对拥有视野单位的位置去检测那些像素点是不是可见的,如果可见修改颜色为白色,这样就可以生成了视野的贴图,认为最左下角的顶点的uv是00,右上角的uv是11。然后渲染地图的时候混合上这样一张视野贴图,战争迷雾大概就是这么一回事。为了优化效果的话这个贴图需要加入几帧内的渐变,这样就平滑过渡了。

Q:对于攻速类英雄的攻击,客户端与客户端之间是如何做的同步?

魏韬:这个其实没有太大的区别,就拿帧同步来说,客户端与服务器之间是以一定的时间间隔在执行,不断的收集客户端的收集客户端的输入,这个英雄的行为虽然被加速了,但是它收到的这个输入也是在其他的客户端上的这个加速状态去执行,得出来的结果也是一样的。

Q:一般的MOBA游戏,有很多的英雄,每个英雄有很多的技能,会开发技能编辑器么吗?一般的技能编辑器怎么做?

魏韬:一般游戏的技能编辑器有两个流派,第一个是基于时间轴的,特征是有个可以编辑的轨道让你制定几分几秒执行什么事情。另外一种就是基于逻辑的,你可以看到很多的东西的联系,什么样的输入会有什么样的输出,包括IF else的逻辑以及循环调用的那种方法等。两种编辑器并不是完全割裂的。综合全局来说,其实现在像是对于手游的话,不建议自己去做技能编辑器,可以把其他的编辑器修改和适配下拿来用会比较方便。

Q:小兵和野怪的AI是怎么做的呢?挂机玩家是如何判定的?

魏韬:小兵和野怪的AI是这样的,比较推荐的用Behavior行为树和assetstore上的插件完成。编辑出角色处于或者满足什么状态会去执行什么样的行为等。挂机的话就是通过该玩家是否长时间没有给服务器发送任何有效的指令来判断,如果长时间没有接收到移动或者其他操作的指令就判断为挂机。

Q:客户端应该如何避免外挂。或者MOBA游戏如何从数据上检测外挂?

魏韬:这个并不是我的强项,我只谈下我个人的理解。如果想从内存的保护方面来做的话,从原理上来说这是没办法彻底保护的。虽然你可以写一些影子逻辑以及各种加密,其实也只是提高别人门槛而已。真正要检测的话还是得从服务器上检测,比如说,帧同步的游戏每隔几帧算下这几帧的关键数据报给服务器,客户端本地的修改就导致这些关键数据和其它客户端的不一致。当服务器发现哪些客户端是不同的话,我们就判定这些客户端出现了异常,如果是BUG的话需要通过大量的数据反馈检测出来,如果是外挂修改的话就需要各种上报的信息进行综合的判断了。

除了以上内容之外,魏韬还在Live中回答了一些听众的问题,让大家纷纷表示受益良多,比如:

帧同步角色物理是如何实现的?

与服务端通信如何加密的,来保证数据安全?

2D场景MOBA游戏的地图是怎么制作的,怎么形成很好的类似3D的透视效果?

............

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171212B0A82U00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券