我读过一些关于客户端预测和服务器对账的文章,但我遗漏了一些部分,我承担了客户端预测的部分,但我不明白对账到底是如何完成的。我将参考这两篇著名文章:
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"帧。
有人能给我指正确的方向吗?感谢
我知道你已经很久没有发布这个问题了,但它在谷歌的订阅源上,所以我会回答的。
我看不到这样做的好处,因为我看不出有什么不同在将来自服务器更新的最后n个输入重新应用到当前时间,并将客户端状态保持为更新之前的状态,我们事先就知道结果会是一样的。
协调的全部目的是与服务器同步。我们真的不知道我们的行动会有什么结果。我们只是预测它。有时结果实际上是不同的,我们仍然想了解服务器上发生的事情。
第一条路绝对是必经之路
第二种方式没有任何意义。请记住,玩家会定期收到更新。这意味着,在200毫秒的延迟下,他将在过去的200毫秒左右看到他的角色。
我看不到这样做的好处,因为我认为将服务器更新的最后n个输入重新应用到当前时间与保持更新前的客户端状态之间没有区别,我们事先知道结果会是一样的。
如果且仅当预测的GameState与服务器GameState(我们刚刚收到的服务器)匹配,则您是正确的,因此没有理由进行任何对账。然而,如果它们不匹配,重新应用输入会给我们一个不同的结果当您应用服务器对账时,这就是。