原文:https://www.gabrielgambetta.com/lag-compensation.html
简介和上上篇的总结差不多.
滞后补偿
所以你用狙击步枪瞄准目标的头部。你开枪-这是一个你不能错过的机会。
但是你错过了。
为什么会这样?
由于前面介绍的客户机-服务器架构,您瞄准的目标是射击前100毫秒敌人的头部所在位置,而不是射击时!
在某种程度上,这就像在一个光速真的非常非常慢的宇宙中玩耍;你瞄准的是敌人的过去位置,但当你扣动扳机的时候,他早就不见了。
幸运的是,有一个相对简单的解决方案,对于大多数玩家来说,这也是一个很好的解决方案(下面讨论的一个例外)。
工作原理如下:
- 当您射击时,客户机将这个事件发送给服务器,并提供完整的信息:您射击的确切时间戳和武器的确切目标。
- 这是关键的一步。由于服务器获得了所有带有时间戳的输入,因此它可以在过去的任何时刻权威地重建世界。特别是,它可以在任何时间点按照任何客户机的样子重建世界。
- 这意味着服务器可以在你射击的瞬间准确地知道你的武器瞄准点上有什么。这是你敌人头的过去位置,但服务器知道这是他在你现在的位置。
- 服务器在该时间点处理快照,并更新客户端。
每个人都很高兴!
服务器很高兴,因为他是服务器。他总是很快乐。
你很高兴,因为你瞄准了你的敌人的头,开枪,得到了一个有回报的头像!
敌人可能是唯一不完全快乐的人。如果他被枪击时站着不动,那是他的错,对吧?如果他在移动…哇,你真是个很棒的狙击手。
但如果他从开阔的地方,躲到墙后,然后被枪击,几秒钟后,当他认为自己是安全的时候呢?
好吧,那是可能的。这就是你所做的权衡。因为你过去射杀过他,他可能在被掩护几毫秒后仍会被射杀。
这有点不公平,但对所有相关人员来说,这是最令人满意的解决方案。错过一个不可错过的机会会更糟!
结论
这是这一系列文章的结尾。这类事情显然很难纠正,但如果对正在发生的事情有一个清晰的概念理解,就不难了。
虽然这些文章的读者是游戏开发者,但它如果被另一组感兴趣的读者:游戏玩家发现了!从玩家的角度来看,理解为什么有些事情会以这种方式发生也是很有趣的。
进一步阅读
作者也是从其他来源学到的这些技巧.包括文章,和源码,和一些经验.
最相关的是 What Every Programmer Needs to Know About Game Networking and Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization.
PS:这篇文章还有第五篇 一个在线Demo取演示这个地址:
https://www.gabrielgambetta.com/client-side-prediction-live-demo.html
在Github 上面还有Unity的Demo:
https://github.com/RamiAhmed/Gambetta_NetworkedDemo
文章地址里面的What Every Programmer Needs to Know About Game Networking 这篇文章年代太久,原文已经找不到啦. 但是发现一个国内翻译的文章. 决定转载拷贝一份.