客户端预测和服务器协调
Client-side prediction & server reconciliation
我读过一些关于客户端预测和服务器协调的文章,但我遗漏了一些部分,我参与了客户端预测的部分,但我不明白协调是如何完成的。参考这两篇知名文章:
http://www.gabrielgambetta.com/fpm2.html
#2. So applying client-side prediction again, the client can calculate the “present” state of the game based on the last authoritative state sent by the server, plus the inputs the server hasn’t processed yet
In effect the client invisibly “rewinds and replays” the last n frames of local player character movement while holding the rest of the world fixed
好的,我认为客户端收到了来自服务器的确认,但是输入是如何重新应用的呢?我可以用两种方式解释这一点。
从客户端的角度来看,游戏循环每秒执行“x”次(每秒帧数)
首先: 未处理的输入在同一帧中重新应用,所以这里的表达“无形地倒带和重放”非常合适,因为最后你看到的是什么屏幕中是重新应用最后一次输入的结果。
我看不出这样做有什么好处,因为我看不出将服务器更新的最后 n 个输入重新应用到当前时间与保持更新前的客户端状态之间没有区别,我们知道提前说结果是一样的。
其次:输入在连续的帧中一一重新应用。人类无法注意到正在重播的几帧,但我不禁想到,如果客户端遇到严重的延迟,他可能会注意到自己回到过去并重播最后的“n”帧。
任何人都可以指出正确的方向吗?谢谢
我知道你发布这个问题已经有一段时间了,但它在 google 的 Feed 上,所以我会回答。
I don’t see the benefit of doing this because I see no difference
between re-applying the last n inputs from the server update to the
present time and keeping the client state as it was before the update,
we know in advance that the result will be the same.
协调的重点是与服务器同步。我们真的不知道我们行动的结果会是什么。我们只是预测它。有时结果实际上是不同的,我们仍然想了解服务器上发生的事情。
绝对是第一种方式。
第二种方式真的没有任何意义。请记住,播放器会定期接收更新。这意味着在 200 毫秒的延迟下,他将一直看到他的角色过去大约 200 毫秒。
I don’t see the benefit of doing this because I see no difference between re-applying the last n inputs from the server update to the present time and keeping the client state as it was before the update, we know in advance that the result will be the same.
当且仅当预测的 GameState 与服务器 GameState(我们刚刚收到的那个)匹配时,您是正确的,因此没有理由进行任何协调。但是,如果它们不匹配,重新应用输入会给我们不同的结果。 那是 当您应用服务器协调时。
我读过一些关于客户端预测和服务器协调的文章,但我遗漏了一些部分,我参与了客户端预测的部分,但我不明白协调是如何完成的。参考这两篇知名文章:
http://www.gabrielgambetta.com/fpm2.html
#2. So applying client-side prediction again, the client can calculate the “present” state of the game based on the last authoritative state sent by the server, plus the inputs the server hasn’t processed yet
In effect the client invisibly “rewinds and replays” the last n frames of local player character movement while holding the rest of the world fixed
好的,我认为客户端收到了来自服务器的确认,但是输入是如何重新应用的呢?我可以用两种方式解释这一点。
从客户端的角度来看,游戏循环每秒执行“x”次(每秒帧数)
首先: 未处理的输入在同一帧中重新应用,所以这里的表达“无形地倒带和重放”非常合适,因为最后你看到的是什么屏幕中是重新应用最后一次输入的结果。
我看不出这样做有什么好处,因为我看不出将服务器更新的最后 n 个输入重新应用到当前时间与保持更新前的客户端状态之间没有区别,我们知道提前说结果是一样的。
其次:输入在连续的帧中一一重新应用。人类无法注意到正在重播的几帧,但我不禁想到,如果客户端遇到严重的延迟,他可能会注意到自己回到过去并重播最后的“n”帧。
任何人都可以指出正确的方向吗?谢谢
我知道你发布这个问题已经有一段时间了,但它在 google 的 Feed 上,所以我会回答。
I don’t see the benefit of doing this because I see no difference between re-applying the last n inputs from the server update to the present time and keeping the client state as it was before the update, we know in advance that the result will be the same.
协调的重点是与服务器同步。我们真的不知道我们行动的结果会是什么。我们只是预测它。有时结果实际上是不同的,我们仍然想了解服务器上发生的事情。
绝对是第一种方式。
第二种方式真的没有任何意义。请记住,播放器会定期接收更新。这意味着在 200 毫秒的延迟下,他将一直看到他的角色过去大约 200 毫秒。
I don’t see the benefit of doing this because I see no difference between re-applying the last n inputs from the server update to the present time and keeping the client state as it was before the update, we know in advance that the result will be the same.
当且仅当预测的 GameState 与服务器 GameState(我们刚刚收到的那个)匹配时,您是正确的,因此没有理由进行任何协调。但是,如果它们不匹配,重新应用输入会给我们不同的结果。 那是 当您应用服务器协调时。