한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Libro blanco del lag en juegos › L1 Proceso del juego en el cliente

Pérdida de precisión del tiempo en float Float time precision loss on long sessions

ID de la causa cg-float-time · Responsable principal Desarrollo de cliente (Equipo de desarrollo)

Abrir la ficha interactiva con gráficos y simulaciones →

Si el juego guarda su hora en un formato decimal de baja precisión (float), cuanto más tiempo lleva encendido, peor es la resolución temporal (la diferencia de tiempo más pequeña que se puede distinguir), y los movimientos y los efectos tiemblan.

Por qué El tiempo transcurrido desde que se abrió el juego se acumula en un float o se pasa tal cual a los shaders → Efecto Cuanto más tiempo lleva encendido, mayor es la diferencia mínima que puede representar el float → En pantalla Solo en los clientes encendidos durante días tiemblan los personajes, las animaciones y los efectos con movimiento continuo; al reiniciar el juego todo va bien

Síntomas
Tirones
Factores
Jitter
A quién afecta
Solo yo
Cuándo
Cuanto más tiempo lleva encendido
Responsable
Responsable principal Desarrollo de cliente (Equipo de desarrollo)
Tareas (Equipo de desarrollo)
Guardar el tiempo transcurrido en double (64 bits) o en un entero, reiniciar periódicamente el tiempo que se pasa a los shaders, hacer pruebas automáticas de larga duración (varios días).
Cifras de referencia
Un float de 32 bits tiene algo más de 7 dígitos significativos, así que tras un día encendido (unos 86,400 segundos) la resolución temporal es de unos 8 ms, casi la mitad de un frame a 60 FPS (16.7 ms), y tras una semana es de unos 60 ms, más que un frame entero.
En el gráfico
Subida gradual · Reportes de temblores según el tiempo encendido
Dónde mirar
Pedir en los reportes de temblores cuánto tiempo llevaba encendido el cliente y comparar antes y después de reiniciar. En desarrollo, una prueba en la que la hora de inicio del juego se fija como si ya hubieran pasado varios días
Se confirma si
Los temblores solo aparecen en clientes encendidos durante días, desaparecen al reiniciar y empeoran cuanto más tiempo lleva encendido
Se descarta si
Si tiembla nada más arrancar: “Búfer de interpolación ausente o demasiado corto” o “Resolución del temporizador”
Se verifica con
En el entorno del jugador
Para saber más
Aparece sobre todo en MMO móviles en los que se deja activado el combate automático y no se cierra el juego durante días. Time.time de Unity también es un float, por eso Unity ofrece aparte Time.timeAsDouble, en double, y recomienda usarlo.

Fuentes

  1. Time.timeAsDouble Unity
    Versión double de Time.time; cuanto más tiempo lleva encendido, más precisa es que la versión float, y se recomienda en la mayoría de los casos
  2. Floating-point numeric types (C# reference) Microsoft
    Precisión de float: unos 6–9 dígitos; de double: unos 15–17 dígitos

Ver también

Misma capa: L1 Proceso del juego en el cliente

Causas de otras capas con el mismo síntoma (Tirones)

Ver la ficha interactiva con gráficos y simulaciones