Если клиент неверно оценивает серверное время, сбиваются момент интерполяции и проверка кулдаунов.
Почему Время сервера синхронизируется один раз при входе и не корректируется, даже когда меняется пинг → Следствие Момент интерполяции и время окончания кулдауна расходятся с сервером → На экране Противник иногда дёргается, умение отклоняется, хотя кулдаун уже прошёл
Основной ответственный Команда разработки · Разработка клиента
Команда разработки: задачи
Регулярно синхронизировать время (измерять время пути туда и обратно и корректировать), подводить часы постепенно, без резких скачков, измерять прошедшее время монотонными часами (monotonic clock) вместо системного времени ПК.
На графике
Плавный рост · ошибка оценки серверного времени
Где смотреть
Регулярно записывать разницу между серверным временем, которое оценил клиент, и серверным временем (номером тика), которое сервер прислал в пакете
Подтверждает
Ошибка растёт со временем после входа или скачком меняется в момент подводки часов ПК, и примерно тогда же растёт число жалоб на отклонённые умения и рывки
Опровергает
Если ошибка остаётся небольшой, а умения всё равно отклоняются, дело в решении сервера или задержке
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
Если прошедшее время измерять по дате и времени ПК (wall clock), игровое время скачет в момент, когда Windows подводит часы по интернет-времени или пользователь меняет время вручную. Прошедшее время нужно измерять монотонными часами, которые никогда не идут назад (monotonic clock, Stopwatch и т. п.).
Acquiring high-resolution time stampsMicrosoft QueryPerformanceCounter (его использует Stopwatch): часы для измерения прошедшего времени, не синхронизируемые с внешним временем. Системное время нужно только тогда, когда требуется время UTC
Time synchronization (Netcode for Entities 6.5)Unity Серверное время оценивается по времени пути туда и обратно, а подстройка идёт за счёт небольшого изменения скорости хода часов, без резких переводов времени