BUAA-Soft-2024-Summer / Soft-Summer-2024

北航软件学院 2024 夏《程序设计实践》 小学期仓库
10 stars 1 forks source link

尝试p2p联机时,无法解决不同玩家间消息不同步的问题 #6

Closed Cheuring closed 3 months ago

Cheuring commented 3 months ago

目前使用c++ easyx winsock2库实现了简单的联机功能

逻辑处理部分都在客户端进行,通过socket将用户按键操作转发给对方,但是出现了信息不同步的情况

例如玩家A在本地走了100m, 但是在对方客户端上只走了80m

Lord-Turmoil commented 3 months ago

你可以从这两个方面进行排查:

  1. 发送的消息是否都收到了?收到的顺序是否正确?
  2. 每帧更新行为是否一致?比如虽然按键是一样的,但是因为帧率不一样,导致移动时间不一样,进而不同步。

如果是帧同步的话,确保以上两点做到了就能实现同步。

Cheuring commented 3 months ago

采用的是tcp连接, 所以排除第一点 第二点我固定了画面更新的帧率,但是怎么在收到所有玩家按键信息后才一起更新

Lord-Turmoil commented 3 months ago

最简单直接的方法,可以为每个玩家设置一个标志位,当标志位都被设置了才更新。

saitewasreset commented 3 months ago

参考UE的实现,似乎可以这样:

  1. 在所有P2P节点中选择一个节点作为“主机”,其含有所有玩家位置等信息的“权威”版本。
  2. 对于非“主机”的客户端,将移动划分为几个阶段,对于每个阶段,每帧向主机发送自身的位置信息(速度,坐标)等,及本帧和上一帧的时间差(可排除帧率不同的干扰)。“主机”使用这些信息进行同步计算,并在每个阶段结束时向所有其它客户端发送其计算出的坐标等位置信息,客户端利用主机的信息进行位置修正。(即,主机的信息是权威版本)

参见:https://dev.epicgames.com/documentation/en-us/unreal-engine/understanding-networked-movement-in-the-character-movement-component-for-unreal-engine (UE的实际实现更加复杂)

Lord-Turmoil commented 3 months ago

同学你好,如果仍有疑问,请麻烦新建一个 Issue。🙏

DeepChirp commented 3 months ago

@BUAA-Soft-2024-Summer Please delete above comments with malicious links and lock this issue.