我想使用物理引擎编写多人游戏。客户端使用物理引擎进行计算并及时显示结果,当然,服务器也需要模拟整个事情。
Afaik,客户端通常将速度和位置发送到服务器。我的想法是将按键发送到服务器。
发送位置/速度:
- 服务器需要对运动进行插值。
- 我不知道如何为物理引擎提供这些数据。
- 在插值上,结果可能不准确。
发送按键
- 我可以像在客户端(通过按键)一样提供服务器的物理特性。这意味着更少的代码!
- 不需要插值。
那么,我的想法有什么问题呢?为什么它(afaik)不在游戏中使用?
我想使用物理引擎编写多人游戏。客户端使用物理引擎进行计算并及时显示结果,当然,服务器也需要模拟整个事情。
Afaik,客户端通常将速度和位置发送到服务器。我的想法是将按键发送到服务器。
发送位置/速度:
发送按键
那么,我的想法有什么问题呢?为什么它(afaik)不在游戏中使用?
我很确定在服务器上计算物理对服务器来说太重了。尤其是人多的时候。虽然这可能会使客户端更快,但服务器将成为瓶颈。
它没有被使用有两个主要原因 - 一个由 user1640050 概述,另一个更重要:
延迟计算 - 你仍然需要在客户端和服务器端计算它,因为在互联网上,服务器和客户端之间会有 20ms-500ms 的延迟。通常发生的是双方都计算物理,并且动作(不是真正的按键)通过网络发送,并带有客户端时间的时间戳。然后,服务器再次进行计算,计算客户端之间的任何交互并将对轨迹的更正发送回客户端。
这样,客户端可以在没有任何服务器反馈的情况下计算游戏的实时演变,并且如果服务器将其他玩家的活动通知客户端,通常会以动作和动作结果的组合形式(更常见)来纠正它。
这样做是为了阻止各种作弊 - 客户对对手的引擎推力了解得越少,添加未经授权的模组和作弊就越难 - 这样客户就知道自己的引擎推力和位置/速度/对手的加速度,但不知道它是如何实现的。