Implementación de suavizado de red

13

Estamos haciendo un juego de disparos en primera persona. El cliente envía su posición al servidor a una velocidad fija (actualmente a 10Hz). El servidor envía un único mensaje que contiene todas las posiciones de los jugadores a todos los jugadores a la misma velocidad (10Hz).

Como se esperaba, el movimiento es bastante agitado ya que el juego de 60 fps solo recibe actualizaciones 10 veces por segundo. ¿Cuál es la mejor manera de suavizar este movimiento? La forma más obvia sería interpolar entre los dos últimos paquetes, de modo que la interpolación finalice a medida que recibamos un nuevo paquete. Pero esto agrega un retraso instantáneo de 100 ms para todos los jugadores.

La otra forma sería usar la velocidad y la aceleración inferidas de los últimos paquetes para predecir dónde está el jugador antes de que llegue el siguiente paquete, sin embargo, si la predicción es incorrecta, el jugador tenderá a saltar tan pronto como se reciba un nuevo paquete .

¿Alguien sabe cómo los títulos AAA resuelven este problema?

Hannesh
fuente

Respuestas:

9

Hacen exactamente lo que acabas de decir: uno de esos dos enfoques o algún compromiso entre ellos. (p. ej., acepte un pequeño retraso e interpolar cuando sea posible, y extrapolar cuando el ping exceda ese retraso). En lugar de saltar (también conocido como 'ajuste') de regreso a una posición corregida, generalmente hace algún tipo de interpolación entre la predicción incorrecta y el valor corregido, suavizándolo, si es posible. También maneja las correcciones en el pasado para reducir la cantidad de corrección que necesita aplicar.

Esta es una pregunta frecuente y hay varios enlaces canónicos que probablemente encontrarás en otra parte de gamedev.stackexchange.com si buscas, e incluyen lo siguiente:

Lo que todo programador necesita saber sobre las redes de juegos (esto resume las cosas en los siguientes dos enlaces)

Fuente de red multijugador

Arquitectura de red irreal

Kylotan
fuente