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

时间:2012-09-04 23:59:30

标签: c# networking xna network-programming game-engine

我试图解决一般问题,即同步射弹射击和游戏网络,但我不确定什么是最合适的。

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

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


示例问题:

客户A 客户B
服务器

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

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


    问题:

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

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

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

1 个答案:

答案 0 :(得分:3)

有趣的是你应该提到半衰期,阀门实际上发表了一篇关于此事的文章Latency Compensating Methods in Client

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

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