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

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

Синхронная загрузка и компиляция шейдеров в главном потоке Synchronous asset load, shader compile

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

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

Перед первой отрисовкой новой локации, монстра или эффекта игра останавливается, чтобы прочитать файлы и скомпилировать шейдеры.

Почему Вход в новую локацию, первое появление незнакомого умения, снаряжения или монстра → Следствие Главный поток ждёт чтения файлов и компиляции шейдеров → На экране Фриз на 0,1–1 с только в первый раз, со второго раза всё нормально

Симптомы
Фриз, Микрофризы
Факторы
Остановка
У кого
Только у меня
Когда
В движении и при смене локации, При определённом действии
Ответственные
Основной ответственный Команда разработки · Разработка клиента
Команда разработки: задачи
Загружать асинхронно, подгружать заранее (прогрев), компилировать шейдеры заранее на экране загрузки или при первом запуске, использовать экраны загрузки.
Цифры для ориентира
Компиляция одного шейдера занимает десятки ms, в тяжёлых случаях больше 100 ms. Загрузка текстуры, в зависимости от скорости накопителя, от десятков до сотен ms.
На графике
Всплеск сразу после входа или техработ · число всплесков времени кадра (сразу после патча или обновления драйвера)
Где смотреть
Дважды записать в PresentMon один и тот же маршрут и сравнить первое прохождение со вторым. В development-сборке Unreal включить r.PSOPrecache.Validation и смотреть stat PSOPrecache и строки «PSO PRECACHING MISS» в логе, в Unity смотреть в режиме Timeline профайлера участки загрузки и шейдеров в долгих кадрах
Подтверждает
Всплески на 0,1–1 с только в новых местах и при первом применении умения, во второй раз их нет. Сразу после патча или обновления графического драйвера жалоб много, потом становится меньше
Опровергает
Если всплеск каждый раз в одном и том же месте, кэш шейдеров ни при чём. Если он повторяется при каждом перемещении и только на ПК с медленным накопителем, это «Стриминг ассетов отстаёт из-за медленного накопителя», а если выделенная память GPU заполнена, это «Нехватка видеопамяти (VRAM)»
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
На ПК графический драйвер сохраняет однажды собранный шейдер в кэш шейдеров и потом использует его повторно. Поэтому сразу после обновления графического драйвера или выхода патча игры этот кэш становится недействительным, и даже у тех, у кого всё было нормально, какое-то время снова бывают рывки. Типичная жалоба: «после патча дёргается в каждом новом месте».

Источники

  1. Shader loading Unity
    При первом использовании варианта шейдера графический драйвер собирает его для GPU, и игра может заметно замереть. Собранный вариант кэшируется, и повторной остановки нет
  2. Optimizing Rendering With PSO Caches in Unreal Engine Epic Games
    Создание состояния конвейера (PSO) в момент, когда оно понадобилось, может занять больше 100 ms, поэтому PSO нужно создавать заранее
  3. Direct3D 12 Return Codes Microsoft
    D3D12_ERROR_DRIVER_VERSION_MISMATCH: кэш PSO, созданный другой версией драйвера, повторно использовать нельзя (после обновления драйвера нужна перекомпиляция)
  4. PresentMon Capture Application (README-CaptureApplication.md) Intel
    Запись времени каждого кадра через FrameTime (время CPU между кадрами)
  5. PSO Precaching for Unreal Engine Epic Games
    С включённым r.PSOPrecache.Validation команда stat PSOPrecache показывает статистику пропущенных PSO, а в лог пишется «PSO PRECACHING MISS». Создание PSO во время игры дольше 20 ms (порог по умолчанию) считается рывком (hitch)

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

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

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

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