移动游戏战斗系统实现方式探讨

我认为现在战斗系统需要满足一下几点。

1、一定要有离线PVE玩法,或者离线PVP玩法,可以在让玩家在网络不好的时候消遣,节省流量。(全民超神、王者荣耀在5V5匹配时候都有一定几率匹配到离线战斗,这个时候是不耗流量的,其他人全是AI控制的)

2、一定要有在线PVP,在线PVE,能够让玩家在网络比较好的时候,实时竞技。增加可玩性。

3、战斗中,尽最大程度节省玩家的流量,例如全民超神这款游戏,一场30分钟的战斗基本上要消耗掉20M的流量,而且此类游戏大部分是玩的联网战斗,基本上在非wifi情况下没法玩。

4、需要有战斗回放机制,可以让策划设计离线玩法的时候更自由,例如COC,战斗回放基本变成了它游戏的一部分。

5、防作弊,如果有离线玩法的话,一定有机制对离线玩法的结果进行验证,要不然等你游戏真火了,你就知道错了。

6、实现难度相对较低。

对于联网游戏来讲,同步的方式主要分为两种,状态同步、帧同步。

1、状态同步:顾名思义,是指的将其他玩家的状态行为同步的方式,一帮情况下AI逻辑,技能逻辑,战斗计算都由服务器运算,只是将运算的结果同步给客户端,客户端只需要接受服务器传过来的状态变化,然后更新自己本地的动作状态、Buff状态,位置等就可以了,但是为了给玩家好的体验,减少同步的数据量,客户端也会做很多的本地运算,减少服务器同步的频率以及数据量。

2、 帧同步:RTS游戏常采用的一种同步技术 ,上一种状态同步方式数据量会随着需要同步的单位数量增长,对于RTS游戏来讲动不动就是几百个的单位可以被操作,如果这些都需要同步的话,数据量是不能被接受的,所以帧同步不同步状态,只同步操作,每个客户端接受到操作以后,通过运算可以达到一致的状态(通过随机种子保证所有客户端随机序列一致),这样的情况下就算单位再多,他的同步量也不会随之增加。

下面我们从以上的5个方面对各自实现方式进行描述:

总结一下:

1、对于回合制战斗来讲,其实选用哪种方式实现不是特别重要了,因为本身实现难度不是很高,采用状态同步也能实现离线战斗验证。所以采用帧同步的必要性不是很大。

2、对于单位比较多的RTS游戏一定是帧同步,对于COC来讲,他虽然是离线游戏,但是他在一样输入的情况下是能得到一样结果的,所以也可以认为他是用帧同步方式实现的战斗系统。

3、对于对操作要求比较高的,例如MOBA类游戏有碰撞(玩家、怪物可以互相卡位)、物理逻辑,纯物理类即时可玩休闲游戏,帧同步实现起来比较顺畅,(有开源的Dphysics 2D物理系统可用 它是Determisti的)。

4、对于战斗时大地图MMORPG的,一个地图内会有成千上百的玩家,不是小房间性质的游戏,只能使用状态同步,只同步自己视野的状态。

5、帧同步有个缺点,不能避免玩家采用作弊工具开图。

 

  • MOBA
    王者荣耀:帧同步
    WAR3:帧同步
    全民超神:状态同步
    乱斗西游:状态同步
    LOL:状态同步
    Dota2:状态同步
    MMO
    MMO均采用状态同步,如魔兽世界
    FPS
    FPS类游戏大多采用状态同步
    动作格斗类游戏
    街机三国:帧同步
    体育竞技类游戏
    NBA2K OL:帧同步
    网络游戏同步“大”分类
  • 什么是帧同步?
    War3/星际等采用,基于指令驱动各个客户端自计算逻辑。服务端只管分发指令,每个客户端根据完整的规则运算整个战场。
    每个客户端播放效果就像是看视频。
    对视觉同步要求较高。
  • 核心
    保证所有客户端每帧的输入都一样–同步性
    相同的输入下要有相同的输出–确定性
  • 优点
    因为只需要同步指令,所以流量消耗非常小
    缺点
    断线需要补帧,即一旦你的战场状态没有了,必须从头开始,从第一个指令运算到连回去的战场状态。
  • 什么是LockStep?
    典型的一种帧同步算法,最早用于P2P。Lockstep把游戏过程划分成了一个个turn,只有当每个turn集齐了所有玩家的操作指令,也就是输入确定了之后,才可以进行计算,进入下一个turn,否则就要等待最慢的玩家。
    使用Lockstep的游戏是严格按照turn向前推进的,如果有人延迟比较高,其他玩家必须等待该玩家跟上之后再继续计算,不存在某个玩家领先或落后其他玩家若干个turn的情况。使用Lockstep同步机制的游戏中,每个玩家的延迟都等于延迟最高的那个人。
  • 什么是Timebucket?
    设置了 bucket的概念, 执行每一帧的时间是固定的 bucket 时间节点, 而不必等到收到所有的 client step 指令, 从而网络不再受最差的 client 限制.
  • 什么是状态同步?
    MMORPG的主要实现方式,服务器负责计算全部的游戏逻辑,并且广播这些计算的结果,客户端仅仅负责发送玩家的操作,以及表现收到的游戏结果。一般来说,玩家发送一个操作到服务器上,服务器根据玩家操作去修改内存中的游戏世界模型,同时运算游戏世界对这个操作的反应,然后把这些反应都广播给相关的多个客户端,每个客户端负责把这些数据表现出来给玩家看。
    一句话,The Server is the Man!
  • 什么是DR?
    Dead Reckoning,导航推测算法,即客户端模拟运动轨迹和路线,如果真实坐标和模拟坐标的差值大于某个极限误差的时候则广播,收到消息后进行平缓的拉扯处理。
    属于客户端预测。
  • 什么是Timewarp?
    客户端先行,发现逻辑不一致的时候,进行回滚。
  • 什么是延迟补偿?
    服务器端考虑了客户端的网络延迟,将服务器状态回滚到延迟前,再进行运算。
  • 什么是延时、抖动、丢包率?
    ping kingsoft.cn
    正在 Ping kingsoft.cn [192.168.12.19] 具有 32 字节的数据:
    来自 192.168.12.19 的回复: 字节=32 时间=5ms TTL=123
    来自 192.168.12.19 的回复: 字节=32 时间=6ms TTL=123
    来自 192.168.12.19 的回复: 字节=32 时间=5ms TTL=123
    请求超时。
    192.168.12.19 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 3,丢失 = 1 (25% 丢失),
    往返行程的估计时间(以毫秒为单位):
    最短 = 4ms,最长 = 6ms,平均 = 5ms
    ______________________________________
    注:延时5ms
    抖动:(4ms-5ms)~(6ms-5ms),即-1ms~+1ms,[最短延时-平均延时] ~ [最长延时-平均延时]
    丢包率:25%
  • 如何选择协议?
    TCP vs. UDP
    乱斗西游采用的是UDP
    NBA2K OL存在用的是UDP
    补充一句:使用哪种同步方式和协议方式没有必然联系;比如乱斗西游是UDP+状态同步,而街机三国是TCP(TCP_NODELAY) + 帧同步
    注:可参考本人的上一篇文章:Networking Basics:TCP and UDP Basics
  • 帧同步如何防外挂?
    如果初始状态一样和随机种子一样,那么只要每帧的输入高度一样(因为是由服务器切帧分发的,可以保持每个客户端的输入序列是一样的),那么每帧的运算结果也是一样的。为此让每个客户端验证每帧的结果是不是与其它几个客户端是一模一样的,我们就可以拿来做为校验原因。只要有不一样的结果,即有人做弊。
  • 为什么MMO不能用帧同步?
    帧同步的[所有人]的输入必须在[所有客户端]进行计算,这样大家运算出来的结果才能一样,才能保证帧同步.注意是【所有人】.所以常见用于rts,moba、2k等房间游戏.因为人数固定.但是mmo中玩家不定,如果同步所有人。。这个带宽(即传输问题)。。所以mmo中用状态同步+aoi视野管理.

 

参考资料:
lockstep 帧同步
RTS游戏
determistic 的unity 物理引擎
lockstep framework
乱斗西游技术分享

发表评论