在两个联网状态之间插值?


11

我在客户端上模拟了许多实体(它们的速度以每帧为基础添加到它们的位置中),我让它们自己推算。他们发送有关上次被查看的地点及其速度变化的更新。效果很好,其他玩家也看到了这项工作。但是,一段时间后,这些播放器开始不同步。这是因为延迟。

我想知道如何在状态之间进行插值,以使它们看起来处于正确的位置。我知道玩家最后一次看到的位置以及他们当前的速度,但是插值到最后一次看到的状态会导致玩家实际向后移动。我根本不能对其他客户使用速度,而只是将它们“拖”向适当的方向,但是我认为这会引起锯齿运动。有哪些选择?

Answers:


9

因此,您会发现模拟通常给定客户端上在给定时间点实际渲染的帧提前一帧或更多帧。因此,换句话说,渲染的内容实际上可能是倒数第二个帧,而不是最后一个帧。

在本文中搜索“ ahead”一词的所有实例,我认为您将比我之前解释的更好地了解图片。


好的,您是否暗示我真的应该像300毫秒之前那样渲染播放器并向未来插值?(在单独的状态下,当一个新的状态到达时,它将切换)
Vaughan Hilts

@VaughanHilts再次请阅读文章和评论。Gaffer是该领域的专家,他比我更清楚地解释了这一点。但是总的想法是,是的,您的仿真模型位于领先地位,而渲染则稍稍落后于此,以说明您描述的效果。它绝不是我所见过的唯一描述此技术的地方。
工程师

2

当你说:

这些播放器在一段时间后开始不同步

我认为您的问题可能与时钟失步有关,而不是与延迟问题有关。如果是延迟,则开始时的状况应该比10分钟时还差。如果一个游戏时钟的运行时间比另一个游戏时钟的运行速度稍快,则将出现一些奇怪的抖动伪像,随着时间的流逝,这些伪像会越来越糟。客户端可能会在将来进行模拟,当当前数据包从服务器到达时,它将拉回客户端,导致实体跳来跳去。运行更多测试以找出答案。

如果确实存在游戏时钟不同步的问题,则需要非常仔细地查看更新循环,并确保每次更新都基于经过的游戏时间(固定时间或可变时间)以及游戏-time使用壁钟之类的东西(而不是渲染时间或其他变量)进行提前。Gaffer 在这方面有一些不错的文章,在这里有一个关于固定时间步长和可变时间步长的不错的问题。希望这可以帮助。


事实并非如此,事实确实是我死了太多(滞后尖峰之类的东西-无法及时收到“停止”的数据包,客户也无法及时纠正自己。我很清楚这一点)这种情况是因为在客户停止后,我可以将大多数DEFINTELAY插值回原位
Vaughan Hilts'Dec 20'12
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.