我正在通过 UDP 实现联网小行星。我打算将客户端发送的用户输入消息限制为仅状态更改。因此,仅当箭头键或空格键上有向下或向上键时才发送消息。这将大大减少从客户端发送的数据包数量。
但是,既然我已经重新阅读了 Gaffers 关于网络物理学的文章和他关于使 UDP 消息可靠的更复杂的文章,我正在重新考虑。他说:
使此输入流能够容忍数据包丢失和无序交付的关键是在发送的每个输入 rpc 中包含一个以秒为单位的浮点时间值。服务器跟踪服务器上的当前时间,并忽略收到的时间值小于当前时间的任何输入。这有效地丢弃了乱序接收的任何输入。丢失的数据包将被忽略。
所以它并不关心数据包是否丢失。现在我在想,指示按下按键以插入船前进的重要数据包可能会丢失,并且永远不会怨恨,从而打破了游戏。
因此,我是否正确地说客户端被迫发送更规律的(直到每次物理更新,每秒 50 次)实际键盘状态而不是状态变化的转储 以适应这种容忍丢包的方案?还是有更高尚的方法?
最佳答案
正如我在评论中所说的那样,没有答案可以统治所有这些。
但在您的情况下,我可能不会转移击键,而是转移物理变化:
- 仅传输物理变化,例如当物体(玩家、小行星)的加速度发生变化并改变到一般游戏状态时(小行星/玩家爆炸、射击、得分)
- 执行此操作时,还要传输该对象的当前位置以补偿延迟(即使只有 3 毫秒,对象的位置也会有一点不同)并更新相应对象的位置(有时看起来像物体会跳动一点,但几乎每个游戏都有这个问题。
- 其他一切(世界物理学,如重力)都可以在客户端本身计算,不需要通过网络传输。
关于c++ - 在网络游戏中通过 UDP 发送键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10024181/