【发布时间】:2012-09-04 23:59:30
【问题描述】:
我正在尝试找到某种解决方案来解决同步弹丸射击和游戏网络的常见问题,但不确定哪种方案最合适。
这是一个 2D 动作横向卷轴,带有多个射弹(没有即时打击武器),并且已经有很多框架(C# XNA 框架和 Lidgren 库)。
此时我认为架构将被建模为类似于半衰期源引擎。客户端将在过去 100 毫秒或大约 3 帧(固定步长 30 fps)内插入远程实体,并使用客户端预测。服务器对模拟具有权限。考虑用运动来编写实现似乎很好,但是当涉及到射弹时,我不确定如何才能最好地为所有玩家提供最佳游戏玩法。
示例问题:
客户 A
客户B
服务器
- 客户端 A 和 B 只是面对面站着。
- 客户端 B 开始向 A 开火,并像往常一样向服务器发送输入。 服务器检测到开火输入并在其模拟中开始开火,同时将事件转发给客户端 A。
- 客户端 A 收到消息,但仍在过去对客户端 B 进行插值(同时弹丸现在正朝着 A 服务器和客户端 Bs 机器)。
- 客户端 A 的渲染最终到达 B 发射弹丸的位置并开始渲染。
- 客户 A 看到它并跳了起来,很容易在他的屏幕上清除它。然而,弹丸在服务器和客户端 B 的角度击中了他。
这也是 2D 横向卷轴,所以一切都是可见的。
这似乎是使用插值的基本副作用(我认为这是必须的,但我愿意接受建议),因为即使没有任何网络延迟,也存在固有的插值延迟。
问题:
我知道它不可能是完美的,但是我可以实施更多或更好的方法来混淆或改善它,使其看起来很好/无缝,还是我遗漏了任何明显的东西?武器的发射确实在射弹实际发射之前有很短的动画时间,我意识到我们可以利用这段时间来隐藏一些延迟,但武器不是即时射击,无论如何我看它总是会有这么大的差距,客户试图躲避射弹和其他客户看到他们的射弹击中他们。
我们可以在玩家移动的情况下在服务器上使用延迟补偿,但我认为这对这种情况没有帮助?
如果弹丸击中导致客户端 A 的位置发生改变,我将不得不倒回客户端 A 并使用新数据重播他的输入,或者如果没有,我必须将弹丸从半空中移开(也许他们会死),无论哪种方式都很丑:(。
【问题讨论】:
-
虽然这是一个非常有趣的问题,但它的范围很广,可能需要好几页才能正确回答。同步客户端-服务器游戏的方法有数千种,其中每一种都可能有效,这取决于您的游戏的工作方式。
-
顺便说一句,您确定这是个问题吗?当然,从概念上讲,它并不完美,但如果延迟足够小,错误大小可能会很小。可能是 A 看到导弹并设法在他的机器上几乎不及时地躲避它与服务器上几乎不及时的情况是如此之小以至于这不是问题。
-
@Beska 是的,在我询问后我意识到我应该把它贴在那里,不知道如何移动它。
-
这当然可能是一个小问题,我还没有实现它来看到它,但它看起来就是这样。我现在在想,至少在过去不渲染远程玩家可能会更好,而只是用航位推算来推断它们。不需要通过网络来回发送很多数据,一切都是由玩家输入确定的,一旦发射武器,它们就会遵循确定的路径,等等。
-
@Beska - 交叉发布不好,让模组迁移吧。
标签: c# networking xna network-programming game-engine