我的游戏是一个相对复杂的网络物理使用案例。玩家和另一个玩家共同控制一个刚体,刚体必须与基于物理的障碍物进行交互,从旋转的轮子(垂直和水平)到挥舞的锤子和移动的平台。游戏基本上不会工作,如果它不感觉到响应,并且在所有玩家看来看起来很可信且同步。进入这个项目时,我知道CSP是理想的解决方案,而且它应该工作,但是我不断遇到问题,其中正常游戏只会导致太多的脱同步,从而导致客户端的抖动,因此我一度认为我必须接受服务器授权模型的现实,即基本上将刚体的动态状态以每次tick的形式反映到客户端上。这种方法看起来完美,但是你实际上必须在客户端上重新播放几次tick以适应延迟或丢失的tick。呃。然而,这已经在我脑子里萦绕了几个月,所以我再次尝试了CSP。进入时,我决定我必须满足以下条件才能满意: * 在预期的玩耍条件下(0-200ms延迟)完全没有抖动(看起来像抖动) * 不进行任何平滑(导致穿透) * 不延迟任何不必要的tick(感觉像延迟) 我差点放弃了,因为我找不到一种方法来平滑抖动而不从过去的tick中进行插值,但是突然间什么东西就出现在我脑子里;而不是平滑到过去的tick,我平滑到重合状态(即“未来的”状态)而不是。换句话说,当我接收到重合(刚体的当前服务器状态快照)时,我记录这个错误,并且从那时起,我就将刚体的图形组件渲染为这个错误,所以一开始刚体根本不会动,随后在几帧中它会平滑到这个未来的状态。同样,这也意味着当我接收到更多的重合(每秒60次)时,我会不断调整错误并重新平滑。然后。它。就。起作用了。诚实地说...它起作用得太好,基本上像黑魔法一样。附带的视频是在100ms延迟/延迟下录制的,客户端(左侧)完全动态且基本上是在实时运行的!事实上,如果你仔细观察,它甚至会“击败”服务器。这个是技术上的妥协;有小的分歧,但是它们是平滑的,足够小,以至于仍然感觉像你在一起玩同一款游戏一样。所以,好吧,我真的不能相信我成功了...诚实地说,我第一次看到它在行动并工作得这么好时几乎哭了!