Анатомия игровых лагов › Поиск по симптомам
Микрофризы: причины (60) и ответственные
Иначе говорят: статтеры, картинка дёргается, будто проседает FPS
Открыть в каталоге симптомов с иллюстрациями →
Движение теряет плавность: короткие остановки чередуются с рывками.
Другие персонажи или весь экран будто спотыкаются: «замер, замер». Точки траектории то сбиваются в кучу, то разъезжаются.
Если пинг в норме, скорее всего, проблема в кадрах на ПК игрока (клиент или ОС). Если пинг скачет, вероятнее джиттер в Wi-Fi или на линии связи. Учтите, что внутриигровой пинг обычно измеряется в игровом цикле, который выполняется раз в кадр, поэтому при скачках кадров может скакать и значение пинга.
Причины этого симптома
L1 Процесс игрового клиента
- Всплески времени кадра: Расчёт одного кадра занимает в несколько раз больше времени, чем обычно, и картинка на миг замирает. (Команда разработки · Разработка клиента)
- Сборка мусора на клиенте: Пока освобождается использованная и уже ненужная память (мусор), вся игра стоит. Характерный признак: микрофризы через равные промежутки. (Команда разработки · Разработка клиента)
- Синхронная загрузка и компиляция шейдеров в главном потоке: Перед первой отрисовкой новой локации, монстра или эффекта игра останавливается, чтобы прочитать файлы и скомпилировать шейдеры. (Команда разработки · Разработка клиента)
- Стриминг ассетов отстаёт из-за медленного накопителя: На медленном накопителе вроде HDD текстуры и модели открытого мира читаются медленнее, чем перемещается игрок. Объекты появляются с опозданием, или игра дёргается, ожидая окончания чтения. (Команда разработки · Разработка клиента)
- Нагрузка на рендеринг при большом скоплении игроков: Когда в кадр попадают сотни игроков, как на осаде или у мирового босса, клиент не справляется уже с самой отрисовкой. (Команда разработки · Разработка клиента)
- Буфер интерполяции отсутствует или слишком короткий: Если отрисовывать пакеты сервера сразу после получения, джиттер (неравномерность интервалов между пакетами) целиком виден на экране. (Команда разработки · Разработка клиента)
- Чрезмерная экстраполяция (dead reckoning): Пока пакеты не приходят, клиент продолжает двигать объект с последней известной скоростью, а обнаружив ошибку, возвращает его назад. (Команда разработки · Разработка клиента)
- Лавина догоняющих шагов при фиксированном таймстепе: После одной остановки игра разом досчитывает накопившиеся шаги и из-за этого снова отстаёт. (Команда разработки · Разработка клиента)
- Ошибка синхронизации часов: Если клиент неверно оценивает серверное время, сбиваются момент интерполяции и проверка кулдаунов. (Команда разработки · Разработка клиента)
- Потеря точности времени во float: Если игровое время хранится в формате с плавающей точкой низкой точности (float), то чем дольше работает клиент, тем хуже разрешение времени (наименьшая различимая разница во времени), и движения и эффекты начинают дрожать. (Команда разработки · Разработка клиента)
- V-Sync и очередь рендеринга: Отрисованные GPU кадры по несколько штук ждут в очереди и выводятся в такт монитору, поэтому ввод доходит до экрана с опозданием. (Команда разработки · Разработка клиента)
- Утечка памяти на клиенте: Чем дольше работает игра, тем больше памяти она занимает, всё сильнее тормозит и в итоге принудительно закрывается. (Команда разработки · Разработка клиента)
- Проверки модуля защиты игры (античита): Модуль защиты от взлома работает вместе с игрой и периодически выполняет проверки. Если проверка тяжёлая или хартбит (периодический сигнал «я жив») с сервером защиты запаздывает, появляются микрофризы или дисконнект. (Команда разработки · Разработка клиента)
L2 ОС и устройство клиента
- Фоновые процессы занимают CPU: Когда ядра заняты антивирусной проверкой, обновлением Windows, программой для стримов или видео в браузере, игровой поток не получает процессорного времени и ждёт. (Внешние стороны · Внешние стороны)
- Энергосбережение и тепловой троттлинг: Из-за работы ноутбука от батареи, режима энергосбережения на телефоне или нагрева устройства падает скорость CPU и GPU. Характерный признак перегрева: сначала всё нормально, а тормоза начинаются заметно позже. (Внешние стороны · Внешние стороны)
- Разрешение таймера: Стандартный таймер Windows работает с шагом 15,6 ms, поэтому «подождать всего 1 ms» на деле растягивается до следующего тика таймера, то есть до 15,6 ms. (Команда разработки · Разработка клиента)
- Проверка пакетов защитным ПО: Когда антивирус или файрвол проверяет каждый пакет, задержка растёт, а при слишком строгих правилах игра принимается за атаку и блокируется. (Внешние стороны · Внешние стороны)
- Нехватка памяти и своп на клиенте: Если вместе с игрой открыты десятки вкладок браузера, ОС выгружает часть памяти игры на диск. (Внешние стороны · Внешние стороны)
- Нехватка видеопамяти (VRAM): Если графическим настройкам нужно больше памяти, чем есть на видеокарте, ОС выгружает текстуры в оперативную память ПК и загружает обратно, и появляются микрофризы. (Команда разработки · Разработка клиента)
- Фоновое сканирование Wi-Fi: ОС периодически перебирает радиоканалы в поисках соседних сетей Wi-Fi, и на это время связь ненадолго прерывается. (Внешние стороны · Внешние стороны)
- Энергосбережение NIC и проблемы драйверов: Если сетевая карта или модуль Wi-Fi уходят в энергосбережение между пакетами, на пробуждение нужно время. (Внешние стороны · Внешние стороны)
- Ограничение обработки в свёрнутом или неактивном окне: Когда игрок переключается на другое окно или сворачивает игру, и сама игра, и Windows ради экономии энергии замедляют её работу. По возвращении накопившиеся пакеты приходят разом, или соединение уже оборвано. (Команда разработки · Разработка клиента)
- Вмешательство оверлеев: Мессенджеры, лаунчеры, программы записи и счётчики FPS встраиваются в рендеринг игры (хукинг), чтобы рисовать свой UI поверх игровой картинки. Работы в каждом кадре становится больше, а иногда оверлей конфликтует с игрой, и она дёргается или принудительно закрывается. (Внешние стороны · Внешние стороны)
L3 Домашняя сеть
- Помехи и слабый сигнал Wi-Fi: При слабом сигнале или помехах пакеты на беспроводном участке приходится отправлять повторно по нескольку раз, и они приходят неравномерно. (Внешние стороны · Внешние стороны)
- Перегруженный радиоканал Wi-Fi: Там, где рядом десятки роутеров (например, в многоквартирном доме), они делят один радиоканал, и каждому приходится ждать своей очереди на передачу. (Внешние стороны · Внешние стороны)
- Слабый или перегретый роутер: Когда на дешёвый роутер приходятся десятки устройств и тысячи соединений, он сам перестаёт справляться. (Внешние стороны · Внешние стороны)
- Слабый сигнал мобильной сети и мёртвые зоны: В лифте, под землёй или в глубине здания растёт число повторных передач, падает скорость, и в итоге дело доходит до дисконнекта. (Внешние стороны · Внешние стороны)
- Частые переключения 5G ↔ LTE (на границе покрытия 5G): Внутри зданий со слабым сигналом 5G или на границе покрытия 5G телефон часто переключается между 5G и LTE, и при каждом переключении пинг скачет или связь ненадолго прерывается. (Внешние стороны · Внешние стороны)
L4 Интернет-маршрут
- Спутниковый интернет (низкоорбитальный и геостационарный): В спутниковом интернете радиосигнал летит в космос и обратно. Через геостационарный спутник один только путь туда и обратно занимает больше 0,5 с. Низкоорбитальные спутники вроде Starlink обычно быстрые, но в моменты перераспределения маршрута задержка скачет, а связь может ненадолго прерываться. (Внешние стороны · Внешние стороны)
- Перегрузка пиринга в часы пик: Примерно с 21:00 до 23:00 резко растёт видеотрафик, и стыки между провайдерами (пиринг) легко перегружаются. (Команда инфраструктуры · Сетевая инфраструктура)
- Неисправность одного из путей ECMP: Провайдеры и ЦОД держат несколько путей к одной цели и для каждого соединения выбирают один из них. Если неисправен только один путь, лаги постоянно бывают только у тех, кому достался этот путь. (Команда инфраструктуры · Сетевая инфраструктура)
L6 Сетевая карта сервера
- Накладные расходы виртуализации и шумные соседи: Если другие виртуальные машины на том же физическом сервере активно используют сеть и CPU, обработка на нашем сервере нерегулярно запаздывает. (Команда инфраструктуры · Серверная инфраструктура)
L7 ОС сервера (ядро)
- Избыток потоков и переключение контекста: Если потоков намного больше, чем ядер, заметная часть CPU уходит только на то, чтобы ОС запускала их по очереди. (Команда разработки · Разработка сервера)
- CPU steal (виртуальная машина): Пока физический сервер (гипервизор) временно отдаёт процессорное время виртуальной машины другим виртуальным машинам (CPU steal), игровой сервер стоит. (Команда инфраструктуры · Серверная инфраструктура)
- Троттлинг CPU в контейнере (квота CFS): Если у контейнера задан лимит CPU, то, израсходовав квоту в пределах периода (обычно 100 ms), он принудительно останавливается до конца периода (троттлинг). (Команда инфраструктуры · Серверная инфраструктура)
- Остановки из-за освобождения и уплотнения памяти: Процесс останавливается, пока ОС уплотняет память (compaction), чтобы собрать большие страницы (huge pages), или освобождает память, чтобы пополнить запас свободной (reclaim). (Команда инфраструктуры · Серверная инфраструктура)
- Плановые задания: Сжатие логов, бэкапы и проверки безопасности, которые запускаются каждый день в одно и то же время, занимают CPU и диск. (Команда инфраструктуры · Серверная инфраструктура)
- Изменение производительности после обновления ОС, ядра, драйверов или прошивки: Игровой код не менялся, но после обновления ОС, ядра, драйверов или прошивки сервер стал работать медленнее. Обновление может поменять значения по умолчанию, планировщик, защиту от уязвимостей CPU (mitigations) и поведение драйверов. (Команда инфраструктуры · Серверная инфраструктура)
L9 Процесс игрового сервера
- Превышение бюджета тика: Если работа одного тика не укладывается в бюджет, интервал тиков сервера растягивается, и вся локация идёт замедленно или с микрофризами. (Команда разработки · Разработка сервера)
- Взрывной рост расчёта видимости (AOI, N²): Если выяснять, кто кого видит, сравнивая всех со всеми, то при росте числа игроков в 10 раз расчёты растут в 100 раз. (Команда разработки · Разработка сервера)
- Синхронные вызовы в игровом потоке: Если посреди тика ждать ответа БД или записи в файл, на это время останавливается вся игра на сервере. (Команда разработки · Разработка сервера)
- Одновременное срабатывание таймеров: Если респавн всех монстров, окончание всех баффов и награды ровно в начале часа приходятся на один тик, этот тик становится в десятки раз тяжелее. (Команда разработки · Разработка сервера)
- Накопление объектов (неубранные предметы и призванные существа): Если предметы на земле, призванные существа и отработавшие таймеры, которые должны исчезать, не удаляются и копятся, то чем дольше сервер работает, тем больше работы в каждом тике. (Команда разработки · Разработка сервера)
L10 Память
- Паузы GC в скриптовом движке: Если на сервере, пусть даже написанном на C++, квесты, AI и умения выполняются скриптами (например, на Lua), то на время работы GC скриптового движка эта зона останавливается. (Команда разработки · Разработка сервера)
- Лавина аллокаций: Если во время события создаётся масса временных объектов, GC запускается намного чаще обычного. (Команда разработки · Разработка сервера)
L11 Диск
- Синхронная запись логов: Если игровой поток на каждой строке лога ждёт, пока диск завершит запись, то при занятом диске останавливается и игра. (Команда разработки · Разработка сервера)
- Лавина fsync: Запрос записать данные на диск «гарантированно» занимает от 0,1 ms до десятков ms в зависимости от диска, а когда таких запросов много, очередь растёт. (Команда разработки · Разработка сервера)
- Исчерпание burst-кредитов облачного диска: У некоторых облачных дисков и небольших конфигураций серверов есть burst-кредиты, которые позволяют какое-то время работать быстрее базовой производительности. Если высокая нагрузка держится долго и кредиты кончаются, скорость резко падает. (Команда инфраструктуры · Серверная инфраструктура)
- Бэкап, сжатие и сканирование: Когда ночной бэкап, сжатие логов или проверка безопасности занимают диск целиком, чтение и запись игрового сервера застревают. (Команда инфраструктуры · Серверная инфраструктура)
L12 База данных
- Контрольные точки и сброс журнала: В моменты, когда БД периодически сбрасывает накопленные в памяти изменения на диск, запросы замедляются. (Команда инфраструктуры · Инфраструктура БД)
L13 Архитектура и эксплуатация серверов
- Перегрузка логирования и мониторинга: При сбое логи растут лавиной, и серверы, которые отправляют логи синхронно, из-за этого тормозят ещё сильнее. (Команда разработки · Разработка сервера)
Архитектура синхронизации
- Ожидание самого медленного игрока в lockstep: В схеме, где все вместе рассчитывают один и тот же ход, при опоздании ввода одного игрока ждут все. (Команда разработки · Разработка сервера)
- Воспроизведение сразу по приходу без меток времени: Если сервер не прикрепляет к событиям время, когда они произошли, а клиент проигрывает их сразу при получении, сетевой джиттер напрямую сбивает тайминг анимаций. (Команда разработки · Разработка клиента)
- Архитектура с хостом-игроком: Если сервером служит ПК одного из игроков, его подключение и производительность ПК определяют ощущения всех. (Команда разработки · Разработка сервера)
- Низкая частота отправки снапшотов: Если сервер отправляет обновления позиций (снапшоты) всего несколько раз в секунду, буфер интерполяции приходится делать соответственно длинным, и другие персонажи видны в более далёком прошлом. (Команда разработки · Разработка сервера)
Проблемы только у части игроков
- Размер буфера ввода на игрока: Если сервер немного накапливает ввод каждого игрока и берёт по одной команде за тик, на чужих экранах движение плавное, но момент, когда действие самого игрока подтверждается сервером, сдвигается на столько же. (Команда разработки · Разработка сервера)
- Управление монстром у тормозящего клиента: В некоторых играх, чтобы снизить нагрузку на сервер, расчёт перемещения монстров поручают клиенту одного из ближайших игроков. Если у этого игрока плохое подключение, монстр странно движется на экранах у всех. (Команда разработки · Разработка сервера)
- Сбой стриминга из-за нехватки памяти или VRAM: Когда два клиента делят видеопамять, для новых моделей и текстур не остаётся места, и часть объектов не рисуется. (Команда разработки · Разработка клиента)
- Отложенный показ объектов из-за ошибки оценки серверного времени: Если клиент неверно оценивает серверное время, только что пришедшие данные объекта он откладывает как «ещё из будущего» или отбрасывает как «слишком старые». (Команда разработки · Разработка клиента)
Первопричины повторных передач TCP
- Ложные быстрые повторные передачи из-за нарушения порядка: Если на нескольких путях или агрегированных линках порядок пакетов меняется, получатель дублирующими ACK сообщает «пакета не хватает», и отправитель повторно отправляет пакеты, которые не терялись. (Команда инфраструктуры · Сетевая инфраструктура)
Каталог симптомов с иллюстрациями