9

我试图找到某种解决方案来解决同步弹丸射击和游戏网络的常见问题,但我不确定什么是最合适的。

这是一个带有多个射弹(没有即时命中武器)的 2D 动作横向卷轴,并且已经有很多框架(C# XNA 框架和 Lidgren 库)。

目前我认为该架构将被建模为类似于半衰期源引擎。客户端将在过去 100 毫秒或大约 3 帧(固定步长 30 fps)内插入远程实体,并使用客户端预测。服务器对模拟具有权限。考虑用运动来编写实现似乎很好,但是当涉及到射弹时,我不确定如何才能最好地为所有玩家提供最佳游戏玩法。


示例问题:

客户端 A
客户端 B
服务器

  1. 客户 A 和 B 只是面对面站着。
  2. 客户端 B 开始向 A 开火,并像往常一样向服务器发送输入。服务器检测到火力输入并在其模拟中开始发射武器,同时将事件转发给客户端 A。
  3. 客户端 A 接收到消息,但过去仍在对客户端 B 进行插值(同时弹丸现在在服务器和客户端 Bs 机器上向 A 射去)。
  4. 客户端 A 的渲染最终到达 B 发射弹丸并开始渲染的地步。
  5. 客户 A 看到它并跳了起来,很容易在他的屏幕上清除它。然而,弹丸在服务器和客户端 B 的角度击中了他。

这也是 2D 横向卷轴,所以一切都是可见的。

这似乎是使用插值的基本副作用(我认为这是必须的,但我愿意接受建议),因为即使没有任何网络延迟,也存在固有的插值延迟。


问题:

我知道它不可能是完美的,但是我可以实施更多或更好的方法来混淆或改善它,使其看起来不错/无缝,或者我是否遗漏了任何明显的东西?武器的开火在射弹实际开火之前确实有很短的动画时间,我意识到我们可以利用这段时间来隐藏一些延迟,但武器不是即时开火,无论我怎么看它总是有客户试图躲避弹丸和其他客户看到他们的弹丸击中他们,这将是一个巨大的差距。

对于玩家移动的情况,我们可以在服务器上使用延迟补偿,但我认为这对这种情况没有帮助吗?

如果弹丸击中导致客户端 A 的位置改变,我将不得不倒带客户端 A 并使用新数据重播他的输入,或者如果没有,我必须从半空中移除弹丸(也许他们会死),丑陋无论哪种方式 :(。

4

1 回答 1

3

有趣的是你应该提到半衰期,valve 居然发表了一篇关于这个的文章,Latency Compensating Methods in Client

航位推算是网络游戏中非常普遍使用的技术,因此您应该能够在网上找到有关此的更多信息。

谷歌给我带来了这篇 gamasutra 文章,它也可能对你有所帮助,航位推算延迟隐藏

于 2012-09-06T12:15:30.090 回答