use*_*184 7 iphone synchronization multiplayer
情况:
我想问一下,使用BT或Web服务器在多人1:1游戏中同步对象的最佳逻辑是什么.游戏中有两个玩家,每个玩家都有多个枪支和子弹,子弹是动态创建的并且在一段时间后消失,我的移动玩家同时移动.
问题:
我有一个真正的同步问题,因为一个设备上的子弹可能比其他设备更快,也可能已经消失或击中一个设备上的一个对象,而另一个设备仍然在空中.
可能性?
在这种情况下,处理同步的最佳方法是什么?如果所有对象都由一个充当服务器的设备控制,而另一个只是获取值,位置并且做很少的思考.或者应该控制分布在每个设备创建的位置,销毁并移动自己的对象,然后通过同步告诉其他设备.
在这方面处理传输延迟的最佳方法是什么,因为BT可能比通过网络播放更快?最好的是一个工作样本 - 非常感谢!
Jef*_*tes 10
你似乎已经开始了一些关于同步的好主意,但是你可能遇到两个重叠的问题:游戏时钟的同步和游戏状态的同步.
(1)同步游戏时钟你需要为你的游戏代表"游戏时间".对于2人游戏,简单地声明一个权限是非常合理的.
所以在权威客户端:
OnUpdate()
gameTime = GetClockTime();
msg.gameTime = gameTime
SendGameTimeMessage(msg);
Run Code Online (Sandbox Code Playgroud)
在另一个客户端可能是这样的:
OnReceivGameTimeeMessage(msg)
lastGameTimeFromNetwork = msg.gameTime;
lastClockTimeOfGameTimeMessage = GetClockTime();
OnUpdate()
gameTime = lastGameTimeFromNetwork + GetClockTime() - lastClockTimeOfGameTimeMessage;
Run Code Online (Sandbox Code Playgroud)
有一些复杂的问题,比如跳过/滑倒(即从网络中获取太多前进/后退的时间)需要进一步的工作,但希望你能得到这个想法.如果您需要,请跟进另一个问题.
注意:此示例不区分"ticks"与"秒",也不区分您的网络协议,也不依赖于您的游戏运行的设备类型(保存要求'设备具有本地时钟').
(2)在拥有一致的游戏时钟后同步游戏状态,你仍然需要弄清楚如何一致地模拟和传播你的游戏状态.为了同步游戏状态,你有几个选择:
异步
为了优化带宽和隐藏延迟,您通常可以对具有高更新频率的字段进行一些本地模拟.例:
drawPosition = lastSyncPostion + (currentTime - lastSyncTime) * lastSyncVelocity
Run Code Online (Sandbox Code Playgroud)
当然,在这种情况下,您必须与模拟版本协调新信息.
同步
与resimulation同步
根据您的描述,选项(1)和(3)似乎适合您的问题.如果您还有其他问题或需要更多细节,请再次询问.