Компьютерная графика
Graphics Engine Architecture
Unreal Engine 5 рендерит Lumen GI, Nanite геометрию и трассировку лучей одновременно на RTX 4090 при 60fps в 4K. За этим - годы инженерной работы: RDG автоматизирует memory aliasing, параллельные command buffers используют все CPU ядра, RHI абстрагирует D3D12/Vulkan/Metal. Архитектура renderer'а - это то, что масштабирует от инди проекта до AAA.
- **id Software DOOM Eternal** рендерит 60fps стабильно на всём от Switch до RTX 3090 через агрессивную RHI абстракцию и platform-specific paths для каждого GPU vendor
- **Filament (Google)** - open source physically-based renderer для Android/iOS/Web: используется в Google Maps 3D, Google Poly, большинстве Google AR experiences
- **bgfx** - cross-platform renderer от автора Minecraft: поддерживает 12 API (от D3D9 до WebGPU) через единый API - используется в десятках indie движков
- **Apple Game Porting Toolkit** транслирует D3D12 calls в Metal в реальном времени, позволяя Windows игры работать на Mac без перекомпиляции - наглядный пример того, что даёт API abstraction
Архитектура Renderer'а
**Renderer - ядро graphics engine.** Модульная архитектура: RenderGraph (граф зависимостей между passes), RHI (Rendering Hardware Interface - абстракция над GPU API), Material System (шейдеры и параметры), Lighting System (GI, shadows), PostProcess (после рендеринга). Каждый слой независим - можно заменить shadow algorithm без касания material system.
Render Dependency Graph (RDG/Frame Graph) - modern подход, заменивший ручное управление render targets. RDG: описываешь passes и их resource dependencies, система автоматически: размещает ресурсы в памяти с aliasing (разные passes используют одну память если не overlap), вставляет barriers, компилирует граф под конкретный GPU. Unreal RDG, Vulkan Render Pass, Metal Tile Shading - всё основано на этом паттерне.
Render Dependency Graph автоматически делает memory aliasing между passes. Что это означает?
Многопоточный рендеринг
**Рендеринг на современном CPU** использует несколько потоков: Main Thread (game logic, physics), Render Thread (подготовка команд рендеринга, culling), RHI Thread (перевод высокоуровневых команд в API команды), GPU Driver Thread. Три буферизованных кадра в полёте одновременно: Render Thread готовит кадр N+1 пока GPU рендерит N.
Parallel Command Buffer Recording - Vulkan и Metal позволяют записывать команды параллельно на разных CPU threads. Игра делит видимые объекты между threads, каждый thread записывает Secondary Command Buffer, в конце primary buffer execute'ит все вторичные. На 8-core CPU: 8x параллельное построение команд. id Tech 7 (DOOM Eternal) активно использует parallel recording для минимального CPU frame time.
Triple Buffering (3 кадра в полёте) увеличивает input latency. Когда правильно использовать Single Threaded rendering без buffering?
Graphics Asset Pipeline
**Asset pipeline** трансформирует source форматы (PBR textures в PNG/EXR, meshes в FBX, shaders в HLSL) в runtime-ready форматы. Ключевые задачи: texture compression (BC7/ASTC), mip generation, mesh optimization (vertex cache optimization, LOD generation), shader compilation (HLSL → DXIL/SPIRV/MSL). Автоматизирован через content build system.
Shader permutation explosion - реальная проблема: один PBR material shader имеет сотни #ifdef (HAS_NORMAL_MAP, TRANSPARENT, SKINNED, INSTANCED, SHADOW_CAST...). 10 boolean флагов = 1024 permutations, каждый компилируется отдельно. PSO (Pipeline State Object) cache в D3D12/Vulkan: compile once, load at startup. Unreal использует ShaderCompileWorker для параллельной компиляции на стартапе.
Texture comprression BC7 (для PC) и ASTC (для mobile) используются вместо PNG/JPG. Почему нельзя использовать PNG на GPU напрямую?
GPU API Abstraction (RHI)
**Rendering Hardware Interface (RHI)** - abstraction layer над GPU APIs. Unreal Engine поддерживает D3D11, D3D12, Vulkan, Metal, OpenGL через единый RHI API. Разработчик пишет рендеринг один раз через RHI, engine транслирует в нужный API. Альтернативы: bgfx (cross-platform renderer), WGPU (WebGPU - Rust, web + native).
WebGPU - следующее поколение web graphics API, заменяющее WebGL. Exposed через wgpu (Rust) и Dawn (Google C++). Дизайн: compute shaders, explicit resource management (как Vulkan/D3D12), но безопасный. Firefox, Chrome, Safari внедряют нативную поддержку. Unreal Engine 5.4 добавил WebGPU experimental backend. Babylon.js уже поддерживает WebGPU.
Vulkan всегда быстрее OpenGL - нужно всегда переходить на Vulkan
Vulkan быстрее при правильном использовании: explicit resource management, parallel command recording, minimal driver overhead. При неправильном использовании - медленнее OpenGL из-за overhead управления
Vulkan предоставляет контроль, а не автоматическое ускорение. OpenGL драйвер автоматически делает многое (resource tracking, barrier insertion, PSO creation) - платя CPU overhead. Vulkan требует делать это вручную - если делаешь оптимально, то быстрее; если неправильно - медленнее
Unreal Engine RHI транслирует вызовы в D3D12 на Windows и Metal на macOS. Какое ограничение есть у такой abstraction?
Ключевые идеи
- **RDG/Frame Graph:** автоматическое memory aliasing, barrier insertion, async compute scheduling; описываешь зависимости - система оптимизирует
- **Многопоточность:** Triple buffering (3 кадра в полёте) для throughput; parallel command recording; VR требует single-threaded path для latency
- **Asset Pipeline:** texture compression (BC7/ASTC) для hardware decode; mesh optimization; PSO cache для shader permutations
- **RHI:** единый API над D3D12/Vulkan/Metal; lowest common denominator; platform-specific features через extensions
Связанные темы
Graphics Engine Architecture объединяет все CG компоненты:
- Particle Systems и VFX — Particle rendering - отдельный pass в frame graph; GPU particles используют async compute overlap с main rendering
- Animation: скелетная и морф — GPU skinning - часть rendering pipeline до rasterization; skinned mesh вычисляется в pre-pass compute shader
- Graphics на собеседовании (FAANG) — Архитектурные вопросы о renderer design - стандарт на senior graphics engineer интервью в NVIDIA, AMD, Apple, Epic
Вопросы для размышления
- Render Dependency Graph автоматически вставляет GPU barriers (pipeline barriers в Vulkan, resource transitions в D3D12). Как RDG знает какие barriers нужны, и почему ручное управление barriers часто приводит к под-оптимальным решениям (слишком широкие barriers) или race conditions (пропущенные barriers)?
- Apple Metal имеет Tile Shading - compute происходит прямо на tile memory (128KB on-chip) между rasterization passes без roundtrip в main VRAM. Как это меняет deferred shading архитектуру для mobile GPU с tile-based rendering?
- Shader permutation system: один Material в Unreal может генерировать 1000+ HLSL permutations (skinned/static, shadow/no-shadow, transparent/opaque...). Как modern движки балансируют между compilation time при startup, runtime compilation latency, и storage size для shader cache?