Рендеринг — game thread → render thread → RHI → GPU
Архитектура рендеринга Unreal — это четырёхуровневая конвейерная система с разделением между потоками. Игровой код в Tick готовит данные на game thread. Render thread собирает команды отрисовки. RHI thread транслирует их в API (DX12/Vulkan/Metal). GPU выполняет. Каждое звено — потенциальное место bottleneck'а, и без понимания, где именно упёрлось, оптимизация это гадание.
Главное архитектурное правило, на котором держится производительность: render thread на N кадров отстаёт от game thread. Это значит, что вы не можете «прочесть результат отрисовки в Tick» — данные ещё не существуют. Все query'и идут асинхронно (FRenderCommandFence, ENQUEUE_RENDER_COMMAND).
Материалы — это граф нод, компилируемый в HLSL, далее в платформенно-специфичный шейдер. Сложный материал может стоить десятки тысяч инструкций на пиксель. Главная ловушка — судить о стоимости материала по визуальной сложности; правильный инструмент — Shader Complexity overlay + stat gpu.
Карта темы
- Архитектура рендеринга — game/render/RHI thread, deferred shading, render passes, RHI как HAL.
- Основы материалов — Material vs MaterialInstance, domain, blend mode, shading model.
- Производительность материалов — instruction count, samplers, dependent texture reads, shader complexity overlay.
- Компиляция шейдеров — DDC, permutations, async compile, cook-time vs runtime.
- Диагностика производительности —
stat unit,stat gpu, GPU Profiler, Unreal Insights.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Считать FPS единственной метрикой | Не различает CPU vs GPU bottleneck |
| Создать сотни уникальных Material вместо MaterialInstance | Каждый — отдельная shader permutation; долгая компиляция |
| Texture sample в loop в материале | Dependent texture reads, кратно дороже |
Включить Translucent материал на больших меше | Translucency пересчитывает forward-shading, медленная |
| Читать render-state из Tick | Данные с задержкой ≥1 кадра, race condition |
| Полагаться на «глаз» для оценки сложности | Shader Complexity overlay показывает реальную стоимость |
| Не использовать MaterialInstance | Перекомпиляция шейдера на каждое изменение |
| Не учитывать lightmap resolution | Pre-baked lighting память |
Значение для собеседований
Рендеринг — senior-тема в UE. Проверяется:
- Чем
stat unitотличается от FPS и как читать его (Game / Draw / GPU). - Что значит «CPU-bound vs GPU-bound» и как определить.
- Чем Material отличается от MaterialInstance.
- Что такое shader permutation и почему компиляция шейдеров «долгая».
- Чем deferred shading отличается от forward (и почему UE в основном deferred).
Типичный неверный ответ: «Низкий FPS — нужен лучший GPU». Реальный ответ — без stat unit нельзя знать, упёрлось ли в game thread (CPU-логика), render thread (draw calls), или GPU (pixel shader cost). Каждое требует разной оптимизации.