Cómo manejar el movimiento aleatorio en tiempo real con la predicción del lado del cliente

10

Estoy construyendo un juego multijugador en tiempo real que ejecuta el mismo ciclo de 'física' en el cliente y el servidor. Estoy usando un comportamiento de dirección 'deambular' que es un movimiento aleatorio esencial. El cliente y el servidor generan diferentes números aleatorios al ejecutar los algoritmos de desplazamiento.

Me pregunto cómo puedo mantener un movimiento de aspecto aleatorio natural, pero usar algo constante que asegure que el cliente y el servidor lleguen a la misma conclusión.

kevzettler
fuente
44
Generar la misma secuencia aleatoria a partir de una secuencia de números pseudoaleatoria es fácil. Lo difícil es sincronizar el uso de esa secuencia. Debes hacer que tu lógica de juego sea determinista, no en el sentido de que no estás usando una secuencia aleatoria, sino para usar la secuencia aleatoria de una manera determinista. La forma más fácil de lograr esto generalmente es evitar cualquier concurrencia en el ciclo lógico del juego, sin embargo, es posible tener concurrencia siempre y cuando los hilos no dependan del tiempo y la secuencia del PRNG cuando se le pide al PRNG un valor aleatorio. Aquí se dragón.
Mentira Ryan

Respuestas:

14

Puedes usar semilla aleatoria . Seleccione el mismo valor de 32 bits en el servidor y el cliente (o el servidor puede enviarlo al cliente al inicio). Úselo como semilla para generador aleatorio. Puede enviar la semilla real del servidor al cliente con la actualización del estado del juego. Si no desea enviarlo, debe asegurarse de que el cliente y el servidor generen el mismo número de números aleatorios mediante este generador aleatorio.

Lo que debe saber antes de decidir no enviar semilla real al cliente:

  • Tendrá problemas con el sacrificio de personajes en el cliente (significa que no procese personajes en una niebla de guerra en el cliente). Si desea tomar la mejor decisión de selección de caracteres, se enviará todo el estado de los caracteres (con semilla real) del servidor al cliente cuando el cliente debe procesar el carácter. Entonces, el servidor debe decidir cuándo el cliente debe procesar el carácter y cuándo no. Asegúrate de usar generadores aleatorios separados para cada personaje.
  • El mismo problema será con las logias de IA.
  • El número aleatorio de este generador aleatorio debe generarse solo en la actualización con delta de tiempo fijo. Si desea usar un dígito aleatorio para la interpolación de AI antes del renderizado, debe usar un generador aleatorio separado (no hay renderizado en el servidor, así que no le importa qué semilla usará).
  • Si desea utilizar diferentes plataformas para cliente y servidor (C ++ y Java, por ejemplo), debe implementar (o encontrar) un generador aleatorio de plataforma cruzada. Ese no es un gran problema, porque los generadores aleatorios son fáciles de implementar.
Kostya Regent
fuente
3

Si tanto el servidor como el cliente están de acuerdo con la semilla, la mayoría de los algoritmos de aleatorización generarán los mismos valores.

Lince Assassino
fuente