-4

总的来说,我是网络和多人游戏的新手,所以我试图进入这个领域作为挑战并发现更多关于它的信息。所以我决定制作一个内置在 cocos2dx 多人游戏中的现成游戏。我使用 enet 创建了服务器端,基本上我正在做的是发送速度和位置。我注意到同步不是很完美我在谷歌搜索了一些说我们应该在服务器端做物理逻辑所以我的问题是:我怎样才能完美地同步客户端之间的运动?如果通过在服务器端做物理的东西我怎么能做这个任何例子?我正在使用(集成在 cocos2dx 中)Box2D 物理引擎

感谢阅读抱歉拼写错误

4

1 回答 1

0

如果您并排玩一些商业 AAA 网络游戏的实例,您会注意到它们也没有完全同步。

网络存在各种滞后,您需要隐藏它。
由于您无法补偿滞后(您无法以比光速更快的速度传输信息),因此您需要创建一个可信的同步模拟。
您可能也不想在每一帧上传输完整的物理更新,但即使您这样做,数据包丢失和延迟也是网络不可避免的事实。

一种经常使用的方法是“航位推算”,这意味着您可以根据实体最后已知的可信位置和速度(可能还有加速度)来推断实体的运动。
当您获得实际实体状态的更新时,您将更新实体的状态。
这增加了另一层复杂性:您不希望事物传送,因此您还需要在推断状态和更新状态之间进行插值。

为了避免作弊者,您还可以让服务器成为世界外观的权威,并将您的输入数据 - 按键,鼠标移动...... - 发送到服务器而不是物理状态,然后做所有事情在服务器和客户端上进行计算。
(不仅仅是服务器,因为您需要在服务器确定“真相”时近似世界。)

如果你现在认为“但这意味着不同玩家的世界状态是不同的”,你是对的。
实际上这无关紧要——因为你很少有两个玩家并排观看同一件事,你只需要这个世界对每个人来说都是合理的。
在实践中你需要做什么才能使世界变得合理取决于你的游戏(回合制策略游戏对时间故障的敏感度不如快节奏的 FPS 游戏),以及在不破坏幻觉的情况下你可以采取哪些捷径.

于 2018-02-22T14:48:36.600 回答