Les autres réponses ne font que spéculer, alors j’ai écrit un simple projet Unity et l’a laissé fonctionner pendant un moment. Après quelques heures, voici le résultat:
UnityEngine.Time.time
perd de la précision assez rapidement. Comme prévu, après 4 heures de jeu, les valeurs sautent de 1 milliseconde et l’imprécision augmente par la suite.
UnityEngine.Time.deltaTime
conserve sa précision initiale inférieure à la milliseconde même après que Unity a fonctionné pendant des heures. Ainsi, il est pratiquement garanti que le résultat deltaTime
provient d'un compteur haute résolution dépendant de la plate-forme (qui déborde généralement après 10 à 1000 ans). Il reste un petit risque qui deltaTime
perdra encore de la précision sur certaines plates-formes.
L’inexactitude de Time est un problème pour tout ce qui en dépend UnityEngine.Time.time
. Un exemple spécifique est la rotation (par exemple d’un moulin à vent), qui est généralement basée sur UnityEngine.Mathf.Sin(UnityEngine.Time.time*rotationSpeed)
. Un problème encore plus important est celui _Time
qui est explicitement utilisé pour les animations par les shaders. Quelle doit être l'inexactitude avant de commencer à être perceptible? Une précision de 20-30 ms (2 jours) devrait être le point où les personnes qui sont au courant du problème et qui portent une attention particulière le remarqueront. À 50-100 ms (5-10 jours), les personnes sensibles qui ne connaissent pas le problème commenceront à le comprendre. A partir de 200-300 ms (20-30 jours), le problème sera évident.
Jusqu'à présent , je ne l' ai pas testé l'exactitude des _SinTime
, _CosTime
et Unity_DeltaTime
, donc je ne peux pas commenter ces.
C'est le script que j'ai utilisé pour tester. Il est associé à un UI.Text
élément, les paramètres de lecteur du projet permettent au projet de s'exécuter en arrière-plan et VSync dans les paramètres de qualité est défini sur Toutes les secondes vide.
public class Time : UnityEngine.MonoBehaviour {
void Start () {
LastTime = (double)UnityEngine.Time.time;
StartTime = System.DateTime.Now;
LastPrintTime = System.DateTime.Now;
}
double LastTime;
System.DateTime StartTime;
System.DateTime LastPrintTime;
void Update () {
double deltaTimeError = (double)UnityEngine.Time.deltaTime - ((double)UnityEngine.Time.time - LastTime);
if (System.DateTime.Now - LastPrintTime > System.TimeSpan.FromMilliseconds(1000))
{
GetComponent<UnityEngine.UI.Text>().text = "StartTime: " + StartTime.ToLongTimeString()
+ "\nCurrentTime: " + System.DateTime.Now.ToLongTimeString()
+ "\n\nTime.deltaTime: " + UnityEngine.Time.deltaTime.ToString("0.000000")
+ "\nTime.time - LastTime: " + ((float)(UnityEngine.Time.time - LastTime)).ToString("0.000000")
+ "\nAbsolute Error: " + System.Math.Abs(deltaTimeError).ToString("0.000E0");
LastPrintTime = System.DateTime.Now;
}
LastTime = UnityEngine.Time.time;
}
}
Si vous vous interrogez sur la 0.033203
valeur, je suis à peu près certaine que c'est en 0.033203125
fait une représentation binaire à virgule flottante 00111101000010000000000000000000
. Notez les nombreux 0
s dans la mantisse.
Solutions de contournement
La plupart des genres n'ont pas besoin d'une solution de contournement. La plupart des joueurs ne joueront même pas un jeu pendant 100 heures au total. Investir de l'argent pour résoudre un problème que les gens ne remarqueront donc qu'après quelques jours hypothétiques de temps de jeu continu est économiquement non viable. Malheureusement, je ne parviens pas à trouver une solution de contournement universelle simple qui résout le problème dans son ensemble sans entraîner des inconvénients importants.