Pregunta

He estado leyendo Este artículo de Valve que parece explicar la arquitectura de su sistema multijugador.Parece que retrasan la representación con un par de tics en el cliente para poder manejar los paquetes descartados, pero también envían paquetes como "instantáneas delta" (la diferencia entre dos estados adyacentes).

Supongamos que tenemos los momentos A, B, C, y el cliente tiene razón en el momento A pero descarta el paquete en B y luego recibe el de C.¿Cómo puede deducir correctamente el estado en el momento C?El paquete en C solo indica (creo) el delta entre los estados B y C, y el cliente solo conoce el estado en A.¿Que me estoy perdiendo aqui?

¿Fue útil?

Solución

Los deltas no tienen que ser relativa al mensaje anterior que fue enviado (por delta o instantánea). En cambio, estarían en relación con el último reconoció Estado. Así, en el ejemplo anterior, la actualización en C podría ser un delta con respecto a A. La pérdida por lo tanto, el mensaje B se convierte en un inconveniente ya que los deltas son cada vez más grande (y potencialmente de error está acumulando), pero finalmente un mensaje llegará a través y ser reconocido, y el servidor puede comenzar a enviar los deltas relativos a ese estado actualizado.

Otros consejos

El estado completo se sincroniza periódicamente o a petición del cliente. Interpolación / extrapolación se puede utilizar para compensar la pérdida de paquetes a la espera de una actualización de la posición completa. Algunos eventos requieren entrega reliabe y un medio de acuse de recibo se podría añadir.

Glenn Fiedler tiene algunas excelentes artículos sobre juegos en red en su < a href = "http://gafferongames.wordpress.com/" rel = "nofollow noreferrer"> Blog .

Este viejo artículo sobre Quake 3 redes sonidos similares. Los estados del delta representan los cambios desde el último cliente reconocieron estado que fue recibido. Por lo tanto, si el servidor ve que el cliente está detrás entonces el siguiente delta será creado a partir de la diferencia entre el estado del cliente y el estado actual del servidor.

Sin mirar a la puesta en práctica, me imagino que el paquete C también incluye el ID del paquete es el delta de (en este caso, paquete B).

Cuando el cliente recibe el paquete C siguiente paquete A, se sabrá que no ha visto paquete B, sin embargo, y por lo tanto puede solicitar una actualización completa del servidor.

Estoy adivinando de vez en cuando envían una instantánea completa. esto es por qué los juegos implican lag personas corriendo a una velocidad inadecuada como marcos delta se dejan caer, a continuación, "teletransportarse" a la posición correcta cuando una instantánea completa entra en acción.

Del artículo vinculado:

Por lo general, las instantáneas completas (no delta) solo se envían cuando se inicia un juego o cuando un cliente sufre una gran pérdida de paquetes durante un par de segundos.Los clientes pueden solicitar una instantánea completa manualmente con el comando cl_fullupdate.

El servidor probablemente envía completamente sincronizaciones (es decir, no deltas) periódicamente, pero con menos frecuencia. Eso es lo que estoy haciendo, por lo menos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top