情况:
我想问一下,使用BT或网络服务器在多人1:1游戏中同步对象的最佳逻辑是什么。游戏中有两个玩家,每个玩家都有多个枪支和玩家。子弹,子弹是动态创建的并且在一段时间后消失,我的移动玩家同时移动物体。
问题:
我有一个真正的同步问题,因为一个设备上的子弹可能比其他设备更快,也可能已经在一个设备上移动或击中一个对象,而另一个设备上仍然在空中。
可能性?
在这种情况下处理同步的最佳方法是什么?如果所有对象都由一个充当服务器的设备控制,而另一个设备只能获取值,位置并且很少考虑。或者应该控制分布在每个设备创建的位置,销毁并移动自己的对象,然后通过同步告诉其他设备。
在这方面处理传输延迟的最佳方法是什么,因为BT可能比通过网络播放更快? 最好的是一个工作样本 - 非常感谢!
答案 0 :(得分:10)
你似乎已经开始谈论有关同步的一些好主意,但是你可能遇到两个重叠的问题:游戏时钟的同步和游戏状态的同步。
(1)同步游戏时钟 你需要为你的游戏代表“游戏时间”。对于2人游戏,简单地宣布一个权威是非常合理的。
所以在权威客户端:
OnUpdate()
gameTime = GetClockTime();
msg.gameTime = gameTime
SendGameTimeMessage(msg);
另一个客户端上的可能是这样的:
OnReceivGameTimeeMessage(msg)
lastGameTimeFromNetwork = msg.gameTime;
lastClockTimeOfGameTimeMessage = GetClockTime();
OnUpdate()
gameTime = lastGameTimeFromNetwork + GetClockTime() - lastClockTimeOfGameTimeMessage;
有一些复杂功能,例如跳过/滑倒(即通过网络向前/向后过多的时间)需要进一步的工作,但希望你能得到这个想法。如果需要,请跟进另一个问题。
注意:此示例不区分“ticks”与“秒”,也不区分您的网络协议或游戏运行的设备类型(保存要求'设备有本地时钟')
(2)同步游戏状态 在拥有一致的游戏时钟之后,您仍然需要弄清楚如何持续模拟和传播您的游戏状态。为了同步游戏状态,你有几个选择:
异步
为了优化带宽和隐藏延迟,您通常可以对具有高更新频率的字段进行一些本地模拟。例如:
drawPosition = lastSyncPostion + (currentTime - lastSyncTime) * lastSyncVelocity
当然,在这种情况下,您必须与模拟版本协调新信息。
同步
与resimulation同步
从您的描述中,选项(1)和(3)似乎适合您的问题。如果您还有其他问题或需要更多细节,请再次询问。
答案 1 :(得分:1)
因为一个设备上的子弹可能比其他设备更快
如果游戏设计得当,这不应该发生。
这些天的大多数游戏(特别是多人游戏)都在 ticks 上工作 - 小时候。每个系统在计算勾选期间发生的事情时应该得到完全相同的结果 - 没有“子弹在一台机器上移动得比在另一台机器上移动得快”。
然后,确保每个系统为每个玩家获得相同的输入(您需要将每个玩家的输入广播到每个其他玩家,以及输入在其中注册的标记),并且确保它是一个更简单的问题。每个系统以相同的速率计算滴答。
答案 2 :(得分:0)
了解更多详情,请查看此帖: - Synchronization in multiplayer networked game?