游戏网络弹丸实施/概念问题

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

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

此时我认为架构将被建模,类似于半衰期源引擎。 客户端将在过去(固定步骤30fps)并使用客户端侧预测插入远程实体~100ms或大约3帧。 服务器拥有模拟权限。 考虑使用移动编码实现似乎很好,但是当涉及到射弹时,我不确定如何最好地为所有玩家提供最佳游戏。

示例问题:

客户A.
客户B.
服务器

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

这也是2D sidescroller所以一切都是可见的。

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

题:

我知道它不可能是完美的,但有没有更多或更好的方法可以实现混淆或改善它以使它看起来很好/无缝,或者我错过任何明显的东西? 在实际发射射弹之前,武器的发射确实有一个短暂的动画时间,我意识到我们可以利用那个时间来隐藏一些延迟,但是武器不会立即射击,而且任何我看它的方式总是与客户试图躲避射弹和其他客户看到他们的射弹击中它们之间存在巨大差距。

对于玩家正在移动的情况,我们可以在服务器上使用滞后补偿,但我不认为这可以帮助这种情况?

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

有趣的是你应该提到半衰期,阀门实际上发表了一篇关于此的文章,客户端的延迟补偿方法

Dead-Reckoning,是网络游戏中非常常用的技术,所以你应该能够在网上找到更多关于这个的信息。

谷歌给我带来了这篇gamasutra文章,它也可能对你有所帮助, Dead Reckoning Latency Hiding