【问题标题】:C++ Multiplayer game using ENet/Cocos2dx [closed]使用 ENet/Cocos2dx 的 C++ 多人游戏 [关闭]
【发布时间】:2018-02-22 12:04:18
【问题描述】:

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

感谢阅读抱歉拼写错误

【问题讨论】:

  • 请提供一个小的可重复和可编译的问题示例。展示你到目前为止所做的事情。
  • 您的问题有多大?毫秒?秒?在。。。之间的某处?客户端是否在世界各地的同一个网络、不同的网络上?请记住,除非所有客户端都在同一个网段上,否则由于网络延迟以及客户端和服务器之间的距离,它们之间的同步总是会相互“关闭”。
  • 标点符号也不错。
  • 当玩家加入服务器时并不是一件大事,服务器会向每个客户端发送有一个加入的客户端并使用玩家类创建一个玩家实例,然后每当玩家移动他的人时将速度发送给其他客户端并移动已经创建的实例
  • 你有没有真正检查过你最喜欢的网络游戏是否完美同步?

标签: c++ cocos2d-x game-physics multiplayer enet


【解决方案1】:

如果您同时玩几个商业 AAA 网络游戏实例,您会注意到它们也没有完全同步。

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

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

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

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

【讨论】:

  • 感谢所有这些想法,您的回答似乎是合乎逻辑的,但即使您在本地机器(localhost)上运行两个客户端和服务器,也会有延迟?我不这么认为
  • 只要有网络,就会有延迟。如果您使用 TCP/IP,您甚至可能在 TCP 消息缓冲区已满之前不会发送任何信息,即使在同一台机器上也可以非常明显。
  • 我正在使用 UDP .. 我搜索了一些关于“航位推算”的内容,您提到的其他内容实际上是一个很好的观点,但在 localhost 上运行测试不应该显示任何滞后/不同步 innit ?
猜你喜欢
  • 2011-08-31
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 1970-01-01
相关资源
最近更新 更多