游戏开发论坛

 找回密码
 立即注册
搜索
查看: 21786|回复: 0

浅谈RTS游戏网络同步:3种同步机制模式的实现

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2016-5-9 15:48:48 | 显示全部楼层 |阅读模式
QQ截图20160509154253.jpg

  GameRes游资网授权发布 文 / 王耀威

  RTS游戏有很多,可能大家比较熟悉的有Warcraft III (dota)和 StarCraft,早期西木的沙丘,红色警戒更是rts游戏的鼻祖,带给我们无限的欢乐和回忆。还有当下比较流行lol与dota2,实际上都是孙子辈的游戏了。

  RTS游戏同步很重要,而且同步也能非常稳定地实现。的那么他们到底是怎么做到高频操作又同步的呢?

  同步机制

  假设游戏中A,B两个玩家移动,并同时向对方发出射击指令,如果没有合适的同步机制,那么可能出现的情况有:

  • A屏幕显示B已经被杀死,B屏幕显示A已经被杀死
  • 或者在瞄准后确打不到对方

  图中玩家Plyaer1,Plyaer2在两个不同的客户端,表现出不同效果:

1.png

  因为网络是有延时的,而每个玩家的网络情况都不尽相同。还有每帧渲染的延迟(早期的计算机性能不够好的时候会出现这个问题)

  同步机制最重要的作用就是解决延迟等可能发生不一致的情况。

  同步机制的分类

  Peer-to-peer模式:

  没有服务器,每个玩家互相连接,各自模拟整个流程.典型的lockstep模式

  优点:减少主机带来的延时

  缺点:容易作弊

2.png
  Client-Server模式

  所有的操作需经过服务器确认后才能进行客户端模拟,如arpg传奇类都是此架构,如果延时高就会有明显的卡顿。

  优点:服务器是绝对的权威,可以防止作弊,可以做更多的管理与限制

  缺点:服务器变的更复杂,服务器断线,所有玩家断线,属于服务器依赖型。

3.png

  早期的RTS游戏大多采用Lockstep方案来设计,像罗马帝国,沙丘之类。

  Lockstep最早用于军队中:

4.png

  就是说玩家的数据每个时间段同步一次,同步的走。

  标准的lockstep模式

  • 每个玩家互相连接,整个游戏过程划分成一组turn指令帧,由玩家自我模拟
  • 游戏速度取决于网络最慢的那个玩家
  • 一个玩家掉线不会影响到其他玩家

  什么是Turn?

  一个turn可以理解成1个回合,相信大家都玩过回合制游戏吧,只是这个turn非常短,大概100MS-200MS。玩家相互之间发送的指令在每个turn间隔发出。

5.png

  每个玩家只需要接收指令,并在本地播放指令就可以啦。

  War3如何运算伤害?

  玩家到底是发送什么指令到主机,主机到底参与了什么计算呢?

  实际上玩家都只需要发送基本的指令如选择单位,移动单位,使用技能1234,点击物品栏1-6,可以通过APM查看软件看到一些基本操作事件。

6.png

  也就是说所有的一切伤害计算都是在本地计算完成的。

  包括伤害,暴击,命中,刷怪等,只要初始化好随机数种子就可以啦。

  玩家只是发送操作指令,如点击坐标(0,1, 0),左键框选(100,100,50,50)等。

  每个玩家都在模拟全部的流程。

  那么War3到底算不算使用lockstep模式,或者是特殊的client-server?

  其实可以通过几个问题判断出:

  • 非主机玩家卡是否可以影响到其他玩家,如果不会,那么更可能是client-server模式
  • 可以通过抓包工具拦截网络数据包的流向,来判断是否是peer to peer的连接方式还是只连接到主机(或通过主机强制掉线方式判断)。

  一个外国朋友的回答:

7.png

  个人也认为War3是基于Client-Server的一种的特殊模式,主机肯定需要验证一些逻辑。

  主机负责广播每个client的指令,

  这存在两个问题:

  • 本机(非主机)发出的指令,如果超时或者丢包,是否直接丢弃?
  • 其他玩家的指令,主机转发未成功确认,如何处理?

  第一个问题

  1.如果是本机(非主机)发出的指令超时,可以直接丢弃。(如果不丢弃,其他玩家就必须等待结果,这样会导致挂起,而且会非常频繁,这里还有udp协议容易丢包的原因,但是war3好像并没有经常性的挂起)

  还有一种可能,客户端得知之前的turn没有发送成功,把当前这轮的指令和上一轮的指令进行合并,然后一起发出,这样本地客户端就不会有任何的异样了。

  例如玩家移动到A后再移动到B

  上个turn的指令是移动到A点,但是没有发成功,下个turn的指令先移动到A,再移动到B,这样在客户端就不会有丢失的感觉啦,还是可以正常的模拟而不会影响到其他玩家。

  2. 收其他玩家的指令超时,那么属于我们自身网络的问题,如果丢弃必将导致游戏进程不同步,所以服务器必须将他们的turn指令都缓存起来,

  或者缓存一部分turn指令集,在我网络稳定的时候,把丢失的那一部分turn指令集发给我,而我只需要下载那个list加快gameupdate就好啦。

  关于外挂的问题

  相信玩过魔兽的人基本都用过,实际上像战争迷雾,显示单位等只会保存一个状态值在内存中,只要定位到内存地址,改一下变量值就好了,一般是服务器是不会检测这个的。

  而攻击力,道具数量等,由于大家都需要模拟,你本地修改了,会影响到其他人,程序就会发生蝴蝶效应。

  开图挂应该是这类游戏最常见的了。

8.png

9.png

  至于现在非常流行的 Dota2 和 英雄联盟,会额外的加入更多服务器来验证和计算一些外部数据,但内部原理是一致的,早期的游戏与现在的网游不可同日而语。

  相关阅读再谈网游同步技术:实时动作游戏同步方式和传输协议选择

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-20 10:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表