如何通过客户端预测处理实时随机运动


10

我正在构建一个实时多人游戏,该游戏在客户端和服务器上运行相同的“物理”循环。我使用的转向行为“徘徊”是必不可少的随机运动。运行漫游算法时,客户端和服务器生成不同的随机数。

我想知道如何保持自然随机的运动,但使用一些常数来确保客户端和服务器得出相同的结论。


4
从伪随机数序列中生成相同的随机序列很容易。困难的是同步使用该序列。您需要使游戏逻辑具有确定性,而不是从不使用随机序列的意义上说,而是以确定性方式使用随机序列。实现此目的的最简单方法通常是避免游戏逻辑循环中的任何并发,但是,只要向PRNG询问随机值时线程不依赖于PRNG的时间和顺序,就可以并发。这是龙。
Lie Ryan

Answers:


14

您可以使用随机种子。在服务器和客户端中选择相同的32位值(或服务器可以在启动时将其发送给客户端)。将其用作随机生成器的种子。您可以通过游戏状态更新将实际种子从服务器发送到客户端。如果不想发送,则必须确保客户端和服务器通过此随机数生成器生成相同数量的随机数。

在决定不将实际种子发送给客户之前应了解的内容:

  • 您会遇到在客户端上进行字符剔除的问题(意味着不要在客户端的战争迷雾中深深地处理字符)。如果要进行字符剔除,最好的决定是在客户端应处理字符时,将所有字符状态(带有实际种子)从服务器发送到客户端。因此,服务器必须决定何时客户端应该处理字符以及何时不应该处理字符。确保为每个字符使用单独的随机生成器。
  • 同样的问题也会出现在AI上。
  • 必须仅在具有固定时间增量的更新中生成此随机数发生器的随机数。如果要在渲染之前使用随机数进行AI插值,则应使用单独的随机生成器(服务器上没有渲染,因此不在乎将使用哪种种子)。
  • 如果要为客户端和服务器使用不同的平台(例如C ++和Java),则必须实现(或找到)跨平台随机数生成器。这不是一个大问题,因为随机数生成器易于实现。

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.