Первые кадры: загрузка шейдера и компиляция pipeline
Загрузка ресурса не гарантирует готовность каждого варианта отрисовки.
Разделить стадии
| Стадия | Что происходит |
|---|---|
| Загрузка Shader/Material | Получение ресурса и его кода/параметров |
| Подготовка шейдера | Разбор и компиляция для выбранного графического пути |
| Создание pipeline | Комбинация шейдера с форматом вершин, целью, проходом и другим состоянием |
| Реальное рисование | Использование конкретного варианта на GPU |
Один материал может использовать несколько вариантов. Load<Shader> и успешный разбор кода не являются обещанием, что первый видимый кадр не потребует дополнительной работы драйвера.
Отличить холодное появление
Воспроизведите первое появление материала в одинаковой сцене, затем повторите его в том же запуске. Зафиксируйте рендерер, устройство, драйвер и состояние кэша. Редкий длинный кадр также может быть загрузкой файла, выделением памяти или игровой логикой; не называйте каждый скачок shader stutter без проверки.
В примере стаи Shader создаётся из полного кода и используется настоящим объектом. Дополнительно проверены сохранение и загрузка Shader как .rdata и реальная отрисовка. Это подтверждает рабочий путь ресурса, не время его первого появления.
Прогревать реальный вариант
Подготовьте объекты и материалы под загрузочным экраном так, чтобы нужная геометрия действительно прошла отрисовку. Скрытый объект, пустой Viewport или геометрия вне видимости не гарантируют создание нужного draw-варианта. Учитывайте те же поверхности, проходы, настройки цели и эффекты, которые понадобятся игре.
Ожидание FramePostDraw означает прохождение кадра рендеринга; оно не является GPU-таймером и не гарантирует подготовку всех будущих вариантов. После изменения материала или состояния могут понадобиться другие варианты. В этом API нет универсального обещания «скомпилировать всё навсегда» одним вызовом загрузки.
Различать рендереры и счётчики
RD-путь Forward+/Mobile использует специализированные pipeline и механизмы их подготовки. Compatibility использует OpenGL и другой путь. PIPELINE-компиляционные счётчики нельзя переносить между этими реализациями как одинаковое доказательство готовности: в проверенном Compatibility счётчик PipelineCompilationsMesh равен 0, хотя шейдеры реально используются.
Кэш зависит от выбранного графического пути, драйвера и устройства. Не распространяйте локальный драйверный кэш как универсальное решение для всех игроков. Для выпуска проверяйте холодное появление нужных вариантов на целевых конфигурациях, а не только повторный запуск на машине разработчика.