Существует реальный риск потери точности времени при использовании поплавка одинарной точности. .
Это все еще сохранит точность с точностью до секунды в течение 97 дней . Но в играх мы часто заботимся о точности порядка длительности кадра.
Значение времени с плавающей запятой одинарной точности в секундах начинает терять миллисекундную точность примерно через 9 часов .
Это уже не за пределами возможного для одиночной игровой сессии или оставления игры под управлением «АФК», пока вы на работе / в школе или спите. (Это одна из причин, по которой обычный способ проверить игру - это запустить ее на ночь и убедиться, что она по-прежнему играет правильно по утрам)
На современных консолях, где игры часто приостанавливаются и возобновляются между игровыми сессиями, а не закрываются полностью, неудивительно, что «один сеанс» с игровой точки зрения может превышать 9 часов времени выполнения даже при игре в короткие серии.
Предполагая, что Unity deltaTime
вычисляется из источника времени с более высокой точностью, что подтверждается экспериментами Питера в другом ответе, полагаться на deltaTime
тайминги в масштабе кадра относительно безопасно (просто будьте осторожны с накоплением очень больших длительностей путем суммирования deltaTime
значений - добавляя небольшие приращения к большее число с плавающей запятой - это классический рецепт потери точности, даже если вы компенсируете хитрые алгоритмы ).
Так как fixedDeltaTime
сохраняет то же значение, которое вы установили, вместо того, чтобы динамически переходить от кадра к кадру, вы также можете поместить поведение, зависящее от времени, в FixedUpdate, чтобы получить более строгие гарантии согласованности. deltaTime
автоматически вернет соответствующую фиксированную дельту в этих методах. Несмотря на то, что между обновлениями фиксированных и кадровых кадров может быть частота биений, вы можете сгладить ее с помощью интерполяции .
Чего вы хотите избежать, так это вычислять длительности, вычитая одну временную метку из другой . После нескольких часов игры это может привести к катастрофической отмене, что приведет к гораздо меньшей точности, чем в начале пробега. Если сравнение временных меток важно для ваших систем, вы можете сгенерировать собственное значение времени с более высоким разрешением, используя другие методы, например, System.Diagnostics.Stopwatch
вместо Time.time
.