¿Cómo sincronizar acciones como saltar en multijugador?

11

Soy un desarrollador de juegos para novatos y he estado investigando sobre juegos multijugador. Observé que siempre hay algo de latencia, los jugadores siempre reciben actualizaciones de acciones pasadas. Pero hay técnicas como el cálculo de muertos para manejar la latencia. Puedo predecir el movimiento y hacer movimientos suaves. Pero, ¿cómo sincronizaría las acciones como saltar, dejar de caminar, etc.

Supongamos que el cliente A se estaba moviendo, estaba a 100m a 10.2 con una velocidad de 100m / seg y envió esta información. El cliente B recibiría esta información un poco más tarde, deja que sea 10.4. Entonces, en el cliente B, puedo usar la predicción y colocar el cliente A a 120 m. Pero, ¿y si, el cliente hizo un salto a 110m a 10.3. No puedo predecir eso y, como he estado usando predicciones, no puedo mostrar al cliente A un salto en el pasado.

Puedo resolver este problema al no enviar ninguna acción de salto. Pero, ¿y si mi juego tiene algunos vacíos donde los jugadores pueden caer y morir? Por lo tanto, si no sincronizo las acciones de salto, otros jugadores observarán que un jugador estaba corriendo, entonces él cae en el vacío y luego aparece nuevamente en la pantalla destruyendo el compromiso visual.

Jump es solo un ejemplo, puede haber muchos escenarios donde la predicción no puede funcionar. Entonces, ¿cómo lidiar con ellos? Un ejemplo de esto puede ser un juego de arena de batalla multijugador en línea como Awesomenauts.

Suyash Mohan
fuente
No sé mucho sobre el modo multijugador, por lo que no podré dar una respuesta adecuada. Pero por lo que he recogido, la configuración ideal sería que sus clientes serían más o menos tontos y solo enviarían teclado, mouse, gamepad o cualquier entrada al servidor, y el servidor hace todo ese movimiento y todo el mundo actualizando y envía posiciones y todos los demás datos relevantes a los clientes, que luego muestran el resultado. Esto casi elimina la predicción y cosas similares.
Christian
@Christian hey! gracias por la respuesta. Sé acerca de este enfoque, pero esto puede hacer que el juego sea desigual si la latencia es alta y, además, uso el sistema en tiempo real BaaS de AppWarp, por lo que toda mi lógica se encuentra solo en el lado del cliente.
Suyash Mohan
La combinación de ambos métodos es el servidor autorizado. Los clientes y el servidor simulan, los clientes envían su entrada, el servidor devuelve el estado autorizado. Los clientes ajustan su estado para que coincida con el estado autorizado. Entonces, cuando los estados coinciden, los clientes se ejecutan como si estuvieran siendo simulados localmente (sin retraso).
MichaelHouse
Recientemente encontré esta serie de tutoriales para dar buenos consejos sobre la gestión de la latencia, parece que sería relevante para sus intereses: enlace
Kris Welsh

Respuestas:

8

El ajuste de cuentas muerto puede no ser la mejor idea en este caso; debes hacer interpolación de entidades (representando efectivamente a los otros jugadores en el pasado, lo que siempre te da posiciones reales y válidas). He escrito sobre esto con mucho más detalle aquí . Si ver o no jugadores en el pasado es aceptable o no depende de los detalles de lo que intentas hacer.

ggambett
fuente
44
Usé este enfoque al escribir mi primer juego multijugador en red. De hecho, utilicé @ ggambett como referencia. Funciono bien para mi.
NoobsArePeople2
1

Hay una redacción bastante detallada sobre el motor de origen. Parece que parte del código fuente relevante también está disponible como parte del SDK de origen.

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

Utiliza una serie de técnicas para tratar de lidiar con la latencia de red en un modelo servidor-cliente. El punto principal parece ser que el cliente local maneja la entrada y otros eventos localmente como si no hubiera un servidor, y luego trata con la posibilidad de que el servidor diga que el cliente lo hizo mal más tarde.

Será
fuente