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

Анатомия игровых лагов › L1 Процесс игрового клиента

Потеря точности времени во float Float time precision loss on long sessions

ID причины cg-float-time · Основной ответственный Команда разработки · Разработка клиента

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Если игровое время хранится в формате с плавающей точкой низкой точности (float), то чем дольше работает клиент, тем хуже разрешение времени (наименьшая различимая разница во времени), и движения и эффекты начинают дрожать.

Почему Время с запуска игры накапливается во float или как есть передаётся в шейдеры → Следствие Чем дольше работает клиент, тем больше наименьшая разница, которую может выразить float → На экране Только в клиенте, проработавшем несколько дней, дрожат персонажи, анимации и эффекты с бегущей текстурой, а после перезапуска всё нормально

Симптомы
Микрофризы
Факторы
Джиттер
У кого
Только у меня
Когда
Чем дольше без перезапуска
Ответственные
Основной ответственный Команда разработки · Разработка клиента
Команда разработки: задачи
Хранить прошедшее время в double (64 бита) или в целых числах, время для шейдеров периодически сбрасывать (зацикливать), гонять многодневные автотесты.
Цифры для ориентира
У 32-битного float чуть больше 7 значащих цифр, поэтому через сутки работы (около 86 400 с) разрешение времени становится около 8 ms, то есть примерно половиной кадра при 60 FPS (16,7 ms), а через неделю около 60 ms, что уже больше одного кадра.
На графике
Плавный рост · жалобы на дрожание в зависимости от времени работы клиента
Где смотреть
Вместе с жалобой на дрожание узнавать, сколько клиент работал без перезапуска, и сравнивать до и после перезапуска. На стороне разработки: тест, в котором время старта игры выставлено на несколько дней назад
Подтверждает
Дрожание есть только в клиентах, проработавших несколько дней, пропадает после перезапуска и тем сильнее, чем дольше работает клиент
Опровергает
Если дрожит сразу после запуска, это «Буфер интерполяции отсутствует или слишком короткий» или «Разрешение таймера»
Чем проверить
Проверка на стороне игрока
Подробнее
Особенно часто встречается в мобильных MMO, где игроки включают автобой и не выключают игру по несколько дней. Time.time в Unity тоже float, поэтому в Unity есть отдельное значение Time.timeAsDouble в double, и рекомендуется использовать его.

Источники

  1. Time.timeAsDouble Unity
    Версия Time.time в double: при долгой работе точнее float, поэтому в большинстве случаев рекомендуется она
  2. Floating-point numeric types (C# reference) Microsoft
    Точность float около 6–9 цифр, double около 15–17 цифр

Смотрите также

Тот же слой: L1 Процесс игрового клиента

Причины с тем же симптомом (Микрофризы) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами