客户端预测&服务器对帐

时间:2015-04-23 07:14:23

标签: networking client-server game-development

我已经阅读了一些关于客户端预测和服务器协调的文章,但我遗漏了一些部分,我参与了客户端预测,但我不明白协调是如何完成的。我将把这两篇着名的文章作为参考:

http://www.gabrielgambetta.com/fpm2.html

  

#2。因此,再次应用客户端预测,客户端可以根据服务器发送的最后权威状态计算游戏的“当前”状态,以及服务器尚未处理的输入

http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/

  

实际上,客户无形地“回放并重放”本地玩家角色移动的最后n帧,同时保持世界其他地方的固定

好的,我认为客户端收到来自服务器的确认,但输入的确切程度如何?我可以通过两种方式解释这一点。

从客户端的角度来看,游戏循环每秒执行'x'次(每秒帧数)

首先:未经处理的输入会在同一帧中重新应用,所以这里的表达式“隐形倒带和重放”非常合适,因为最后你在屏幕上看到的是重新输入最后一个输入的结果。

我没有看到这样做的好处,因为我认为将服务器更新的最后n个输入重新应用到当前时间并保持客户端状态与更新之前没有区别,我们提前知道结果将是相同的。

第二个:输入在连续帧中逐个重新应用。一个人无法注意到一些帧正在被重放,但我不禁想到,如果客户端遇到明显的延迟,他会注意到自己回到过去并重放最后的'n'帧。

有人能指出我正确的方向吗?感谢

2 个答案:

答案 0 :(得分:2)

我知道你已经发布了这个问题已经有一段时间了,但它是谷歌的Feed,所以我会回答。

  

我没有看到这样做的好处,因为我认为没有区别   重新应用服务器更新的最后n个输入到   当前时间并保持客户端状态与更新前一样,   我们事先知道结果是一样的。

协调的重点是与服务器同步。我们真的不知道我们行动的结果是什么。我们只是预测它。有时结果实际上是不同的,我们仍然希望获得服务器上发生的事情的图像。

第一种方式绝对是要走的路。

第二种方式没有任何意义。请记住,播放器会定期收到更新。这意味着,如果延迟时间为200毫秒,他将始终看到他的角色大约200毫秒。

答案 1 :(得分:0)

<块引用>

我没有看到这样做的好处,因为我认为将服务器更新中的最后 n 个输入重新应用到当前时间与保持客户端状态与更新前的状态没有区别,我们事先知道结果是一样的。

当且仅当预测的 GameState 与服务器 GameState(我们刚刚收到的那个)匹配时,您才是正确的,因此没有理由进行任何协调。但是,如果它们不匹配,重新应用输入会给我们带来不同的结果。 那是当您应用服务器协调时。