Libro blanco del lag en juegos › Buscar por síntoma
Entidades invisibles / fantasma: 20 causas y sus responsables
También se dice: no veo al NPC, personajes invisibles, monstruos muertos que siguen de pie
Abrir en la guía de síntomas interactiva →
Un NPC, monstruo o jugador que debería estar ahí falta solo en tu pantalla, o una entidad que ya desapareció sigue solo en tu pantalla.
Los demás hablan con el NPC y tú ves el suelo vacío. Hay un nombre flotando sin modelo de personaje, o un monstruo que no reacciona aunque lo golpees.
Normalmente se perdió un paquete concreto o falló el dibujado de la entidad. La velocidad tiene poco que ver. Hay que revisar diferencias de canal o de phasing, mensajes de aparición o desaparición perdidos, mensajes descartados durante la carga y fallos al cargar assets. La pista decisiva es si la entidad aparece al salir de su rango de visión y volver.
Causas de este síntoma
L1 Proceso del juego en el cliente
- Almacenamiento lento que retrasa el streaming de assets: En un almacenamiento lento como un HDD, la lectura de texturas y modelos de un mundo abierto no sigue el ritmo del desplazamiento, así que las entidades aparecen tarde o el juego da tirones mientras espera la lectura. (Desarrollo de cliente (Equipo de desarrollo))
L8 Sockets y protocolos
- Keepalive con valor predeterminado de 2 horas: Si el otro extremo desaparece sin enviar una señal de cierre, TCP tarda mucho en detectarlo. El keepalive (la función de TCP que comprueba si una conexión inactiva sigue viva) viene desactivado por defecto y, aunque se active, no empieza a comprobar hasta que la conexión lleva 2 horas inactiva. (Desarrollo de servidor (Equipo de desarrollo))
- Slow start tras inactividad: Si una conexión TCP pasa un rato inactiva, vuelve a reducir la ventana de congestión (lo que puede enviar de una vez), y cuando de repente tiene que enviar muchos datos, los envía en varias tandas. (Infraestructura de servidores (Equipo de infraestructura))
Problemas que solo afectan a algunos
- Diferencias de canal, instancia o phasing: Si dos personajes están en canales o instancias distintos, o en “fases” (phasing) distintas en las que los NPC visibles cambian según el progreso de las misiones, cada uno ve un mundo distinto. (Desarrollo de servidor (Equipo de desarrollo))
- Mensajes de aparición descartados durante la carga: En cuanto el personaje entra en una zona, el servidor envía los mensajes de aparición de los NPC cercanos, pero el cliente todavía está cargando el mapa y los descarta. (Desarrollo de cliente (Equipo de desarrollo))
- Condición de carrera en el registro de visibilidad (AOI): Si el momento en que un personaje se registra en la cuadrícula de visibilidad coincide con el momento en que un NPC cambia de celda, el mensaje de aparición de ese NPC puede perderse. (Desarrollo de servidor (Equipo de desarrollo))
- Pérdida del snapshot de referencia (baseline): Cuando el servidor envía “solo lo que cambió desde la última vez”, si se pierde la información completa que se envía una vez al principio (la referencia), los cambios posteriores no se pueden aplicar. (Desarrollo de servidor (Equipo de desarrollo))
- Pérdida del mensaje de desaparición (entidad fantasma): A la inversa, si se pierde el mensaje de “ha desaparecido”, un NPC o jugador que ya murió o se fue sigue solo en tu pantalla. (Desarrollo de servidor (Equipo de desarrollo))
- Pérdida de la ráfaga de mensajes de aparición al entrar: En cuanto el personaje entra en una zona, el servidor envía de golpe los datos de aparición de decenas o cientos de entidades cercanas. Si se envían por un canal no confiable (unreliable), o si el búfer de recepción se desborda mientras el cliente no lee el socket porque está cargando, una parte se pierde y no vuelve a llegar. (Desarrollo de servidor (Equipo de desarrollo))
- Confusión por reutilización de IDs de entidad: Si el servidor reutiliza el mismo ID de entidad cuando reaparece un NPC muerto, un cliente que se perdió el mensaje de desaparición en ese intervalo confunde el NPC nuevo con el antiguo. (Desarrollo de servidor (Equipo de desarrollo))
- Colisión de puertos UDP fijos: Si el cliente está hecho para usar un puerto local fijo, el segundo cliente de la misma computadora no puede usar ese puerto o se reparte los paquetes con el primero. (Desarrollo de cliente (Equipo de desarrollo))
- Bug de sesiones identificadas por IP o dispositivo: Si el servidor o un servidor intermedio distingue las conexiones por IP o por ID de dispositivo, toma los dos clientes de la misma computadora (la misma IP pública) por una sola persona. (Desarrollo de servidor (Equipo de desarrollo))
- Restricciones al multicliente: Si el módulo de seguridad o una política del servidor limitan los clientes de una misma computadora, el segundo cliente no puede abrirse o conectarse, o se desconecta el que se abrió primero. Algunos juegos solo bloquean funciones del cliente adicional. (Desarrollo de cliente (Equipo de desarrollo))
- Procesamiento limitado de las ventanas en segundo plano: Cuando la ventana del cliente está en segundo plano, el juego, el motor y el SO reducen sus frames y su procesamiento. Los paquetes recibidos no se procesan a tiempo y se acumulan o desbordan. (Desarrollo de cliente (Equipo de desarrollo))
- Conflictos por acceso simultáneo a archivos de caché o assets: Si dos clientes escriben a la vez en la misma carpeta de caché o bloquean archivos, uno de ellos no puede cargar los modelos o texturas de los NPC. (Desarrollo de cliente (Equipo de desarrollo))
- Fallo de streaming por falta de memoria o VRAM: Si dos clientes se reparten la memoria gráfica, no queda sitio para cargar los modelos y texturas nuevos que hacen falta, y algunos no se dibujan. (Desarrollo de cliente (Equipo de desarrollo))
- Opciones de visualización distintas: Si opciones como el límite de personajes visibles, ocultar los nombres o modelos de los NPC o el modo de bajos requisitos son distintas en los dos clientes, cada uno ve cosas distintas. (Desarrollo de cliente (Equipo de desarrollo))
- Desajuste de versión o datos del cliente: Si el segundo cliente es otra instalación o no terminó de parchearse, no conoce los ID de NPC nuevos que envía el servidor y los ignora en silencio. (Desarrollo de cliente (Equipo de desarrollo))
- Presupuesto de envío y prioridad por conexión: Si el servidor limita lo que envía a cada conexión y empieza por lo más cercano, la conexión con un límite bajo recibe tarde, o nunca, los NPC lejanos. (Desarrollo de servidor (Equipo de desarrollo))
- Entidades retenidas por errores en la estimación del reloj: Si la hora del servidor que estima el cliente es incorrecta, la información de entidades que acaba de llegar se retiene “porque todavía es futuro” o se descarta “porque es demasiado antigua”. (Desarrollo de cliente (Equipo de desarrollo))
Ver la guía de síntomas interactiva