使用 ENet/Cocos2dx 的 C++ 多人游戏

C++ Multiplayer game using ENet/Cocos2dx

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

感谢阅读如有拼写错误请见谅

如果您并排玩几个商业 AAA 网络游戏实例,您会发现它们也不是完全同步的。

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

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

为了避免作弊,您还可以让服务器成为世界外观的权威,并将您的输入数据——按键、鼠标移动……——发送到服务器而不是物理数据状态,并在服务器和客户端上进行所有计算。
(不只是服务器,因为您需要在服务器确定 "the truth" 时对世界进行近似。)

如果您现在认为 "but that means that the state of the world is different for different players",那么您是对的。
实际上这并不重要 - 因为很少有两个玩家并排观看同一件事,所以您只需要让世界对每个人都显得 似是而非
您在实践中需要做什么才能使世界变得合理取决于您的游戏(turn-based 策略游戏不像 fast-paced FPS 那样对时间故障敏感),您可以采取哪些捷径也是如此在不破坏幻觉的情况下。