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
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
Time.timeAsDoubleUnity 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