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

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

Сборка мусора на клиенте Client GC (Unity C#, Unreal, Lua)

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

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

Пока освобождается использованная и уже ненужная память (мусор), вся игра стоит. Характерный признак: микрофризы через равные промежутки.

Почему Каждый кадр создаются и выбрасываются временные строки, массивы и списки → Следствие Когда мусора накапливается много, GC останавливает главный поток и освобождает память → На экране Регулярные микрофризы раз в несколько секунд или десятков секунд

Симптомы
Микрофризы, Фриз
Факторы
Остановка
У кого
Только у меня
Когда
С постоянным периодом, При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка клиента
Команда разработки: задачи
Сократить аллокации (избегать конкатенации строк, LINQ, захвата переменных в лямбдах), использовать пулы объектов, держать включённым инкрементальный GC (по умолчанию с Unity 2020), запускать GC заранее, когда пауза не мешает, например на экране загрузки.
Цифры для ориентира
Обычно от единиц ms до 100 ms за раз, на слабых телефонах и в играх, которые расходуют много памяти, дольше (в эксперименте около 150–170 ms). GC в Unity при каждом запуске проверяет всю кучу, поэтому чем больше памяти занимает игра, тем дольше пауза.
На графике
Всплески с постоянным периодом · время кадра, моменты запуска GC
Где смотреть
В development-сборке смотреть маркеры GC.Collect и GC.Alloc в профайлере Unity. В Unreal смотреть stat GC и stat Hitches (пишет в лог кадры дольше порога t.HitchFrameTimeThreshold)
Подтверждает
В каждом долгом кадре есть участок GC.Collect примерно той же длины, что и всплеск, а всплески повторяются через равные промежутки от нескольких секунд до десятков секунд. В людных местах растёт GC.Alloc на кадр
Опровергает
Если в долгих кадрах нет участка GC, это «Синхронная загрузка и компиляция шейдеров в главном потоке» или «Нагрузка на рендеринг при большом скоплении игроков»
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
Типично для клиентов на C#, например на Unity. Главный виновник: код, который каждый кадр заново создаёт строки боевого лога, цифры урона и тексты UI. Если микрофризы бывают только в людных местах, значит, где-то есть код, который создаёт тем больше мусора, чем больше вокруг игроков. Инкрементальный GC собирает мусор понемногу в каждом кадре (в Unity по умолчанию 3 ms), но если мусор появляется быстрее, чем собирается, в итоге всё равно случается одна большая пауза. В Unreal Engine тоже есть собственный GC, который убирает неиспользуемые игровые объекты. С настройками по умолчанию он запускается примерно раз в минуту (зависит от версии движка и настроек) и может давать рывок раз в минуту. В клиентах, где игровая логика написана на скриптовом языке вроде Lua, отдельно работает ещё и GC этого языка.

Источники

  1. Garbage collection modes Unity
    Инкрементальный GC включён по умолчанию и собирает мусор частями за несколько кадров. Если его выключить, главный поток стоит всё время проверки кучи, вплоть до сотен ms
  2. Scripting.GarbageCollector.CollectIncremental Unity
    Целевое время одного шага инкрементального GC (квант времени) по умолчанию 3 ms (incrementalTimeSliceNanoseconds)
  3. Garbage Collection Settings in the Unreal Engine Project Settings Epic Games
    Настройка, по которой GC в Unreal запускается с заданным интервалом (Time Between Purging Pending Kill Objects, в секундах). Значения по умолчанию в документе нет
  4. Profiler markers reference Unity
    GC.Collect: время, пока код программы стоит из-за сборки мусора (от менее 1 ms до сотен ms), GC.Alloc: аллокация в управляемой куче
  5. Stat Commands in Unreal Engine Epic Games
    stat GC (статистика сборки мусора), stat Hitches (пишет в лог кадры дольше t.HitchFrameTimeThreshold)

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

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

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

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