Перед первой отрисовкой новой локации, монстра или эффекта игра останавливается, чтобы прочитать файлы и скомпилировать шейдеры.
Почему Вход в новую локацию, первое появление незнакомого умения, снаряжения или монстра → Следствие Главный поток ждёт чтения файлов и компиляции шейдеров → На экране Фриз на 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)»
Чем проверить
Нужны логи и метрики игрового сервера или клиента
Подробнее
На ПК графический драйвер сохраняет однажды собранный шейдер в кэш шейдеров и потом использует его повторно. Поэтому сразу после обновления графического драйвера или выхода патча игры этот кэш становится недействительным, и даже у тех, у кого всё было нормально, какое-то время снова бывают рывки. Типичная жалоба: «после патча дёргается в каждом новом месте».
Источники
Shader loadingUnity При первом использовании варианта шейдера графический драйвер собирает его для GPU, и игра может заметно замереть. Собранный вариант кэшируется, и повторной остановки нет
Direct3D 12 Return CodesMicrosoft D3D12_ERROR_DRIVER_VERSION_MISMATCH: кэш PSO, созданный другой версией драйвера, повторно использовать нельзя (после обновления драйвера нужна перекомпиляция)
PSO Precaching for Unreal EngineEpic Games С включённым r.PSOPrecache.Validation команда stat PSOPrecache показывает статистику пропущенных PSO, а в лог пишется «PSO PRECACHING MISS». Создание PSO во время игры дольше 20 ms (порог по умолчанию) считается рывком (hitch)