Modelo de red
- El modelo de red de Quake 3 es una de las partes más elegantes del motor, y destaca que en entornos rápidos no vale la pena reenviar información que no fue recibida en la primera transmisión.
- Usa UDP/IP, y no utiliza la transmisión confiable de TCP/IP porque introduce latencia.
- La pila de red se amplía con dos capas mutuamente excluyentes: cifrado con claves previamente compartidas y compresión con claves Huffman precalculadas.
- Destaca un sistema del lado del servidor que minimiza el tamaño de los datagramas UDP mientras compensa la falta de confiabilidad de UDP.
Arquitectura
- El lado del cliente es simple: en cada frame envía comandos al servidor y recibe actualizaciones del estado del juego.
- El servidor debe propagar el estado maestro del juego a cada cliente y considerar la pérdida de paquetes UDP.
- Hay tres elementos principales: el estado maestro del juego, la transmisión de comandos del cliente mediante Netchannel, y snapshots almacenados en un arreglo circular con los 32 estados de juego más recientes.
Sistema de snapshots
- Cuando el servidor envía actualizaciones al cliente, siempre copia el estado maestro del juego al siguiente slot del historial del cliente y lo compara con otros snapshots.
- Si no hay un snapshot válido, usa un "snapshot dummy" para generar una actualización completa.
- Si el cliente confirma que recibió la actualización anterior, solo se envían actualizaciones parciales.
- Incluso si se pierde un paquete, se sigue el mismo proceso y se envían en un solo mensaje tanto la información no recibida antes como la nueva.
Resistencia en memoria y C
- Quake3 compara snapshots sin introspection, y la posición de cada campo se configura de antemano mediante arreglos y directivas del preprocesador.
- Usa la estructura
netField_t para definir la posición y el tamaño de los campos, y con eso transmite las diferencias por la red.
Prefragmentación
- El módulo NetChannel divide los mensajes en chunks de 1400 bytes antes de enviarlos, lo que evita que los routers fragmenten los paquetes.
- La fragmentación en routers es costosa porque al entrar a la red bloquea el paquete y al salir de la red obliga a esperar todos los fragmentos.
Mensajes confiables y no confiables
- El sistema de snapshots compensa los datagramas UDP perdidos en la red, pero algunos mensajes y comandos deben entregarse sin falta.
- Esa garantía se abstrae mediante NetChannel.
1 comentarios
Comentarios de Hacker News