VRAM, GPU, текстуры и бенчмаркинг
Когда игра тормозит, узкое место может быть на CPU (логика, draw call submission), на GPU (пиксели, шейдеры) или на передаче данных между ними. Глава про видеопамять, устройство GPU и профилирование.
VRAM
VRAM (Video RAM, видеопамять) — быстрая память на видеокарте. На Apple Silicon — unified memory с сегментом под GPU.
| Типично в VRAM |
|---|
| Текстуры (изображения) |
| Vertex и index buffers |
| Color и depth frame buffers |
| Uniform и constant buffers |
| Compute buffers |
Загрузка CPU → GPU
glTexImage, device.createBuffer, new Texture2D + Apply — дорогие операции. Выполняйте при загрузке уровня, не каждый кадр.
Симптомы нехватки VRAM:
- краши драйвера
- чёрные или розовые текстуры
- внезапный даунскейл в играх
Оценка бюджета
1920×1080 RGBA8 color ≈ 8 МБ. Depth 24 bit ≈ 8 МБ. Post-processing, shadow maps, MSAA — сотни МБ на кадр в современных играх.
Устройство GPU
GPU (графический процессор) — throughput-процессор: тысячи простых ядер, мало ветвлений.
| Термин | Смысл |
|---|---|
| CUDA core / Stream processor | ALU для шейдера |
| SM (NVIDIA) / CU (AMD) | блок ядер + shared memory |
| Warp / Wavefront | 32 (или 64) потока выполняют одну инструкцию синхронно |
Divergence в шейдере
if (uv.x > 0.5) { /* ветка A */ } else { /* ветка B */ }
Разные пиксели в одном warp идут по разным веткам → GPU выполняет обе, маскируя — потеря скорости. Избегайте тяжёлых if в hot path fragment shader.
CPU и GPU — разные задачи
| CPU | GPU |
|---|---|
| низкая латентность | высокая пропускная способность |
| сложная логика, ветвления | однотипная работа на пиксель |
| 8–16 потоков | тысячи |
Текстуры
Текстура — 2D массив цветов. UV (0..1) — координаты на картинке для точки на mesh.
Mipmaps
Уменьшенные копии: 512→256→128… GPU выбирает уровень по расстоянию — меньше aliasing (мерцание), выше скорость.
Фильтрация
| Режим | Вид |
|---|---|
| Nearest | пиксель-арт, резкие границы |
| Linear | сглаживание |
| Anisotropic | чёткие текстуры под углом (полы, дороги) |
Сжатие
BC/DXT, ASTC — меньше VRAM, быстрее sampling на mobile.
Узкие места CPU и GPU
| Симптом | Вероятно |
|---|---|
| CPU 100%, GPU 40% | физика, JS, draw call count |
| GPU 99%, CPU низкий | тяжёлые шейдеры, 4K, overdraw |
| Лаг при спавне врагов | upload текстур, GC (JS/C#) |
| Просадка при resize | fill rate (больше пикселей) |
Инструменты
| Среда | Инструмент |
|---|---|
| Web | Chrome Performance, Spector.js |
| Native GL/Vulkan | RenderDoc |
| NVIDIA / AMD | Nsight, RGP |
| Unity / Unreal | встроенный Profiler |
| Любая | frame time в мс |
Метрики
- Frame time — 16.7 ms @ 60 FPS, 6.9 ms @ 144 FPS
- Draw calls — считать и снижать
- Triangles — LOD + culling (глава 4)
Overdraw
Overdraw — один пиксель перерисован много раз (прозрачные слои, частицы). Дорого для fill rate.
Порядок: сначала непрозрачные ближние объекты (Z-test отсекает дальние), прозрачность — в конце.
Roofline (интуиция)
Мало операций на байт памяти — memory bound (текстуры, bandwidth).
Много математики на пиксель — compute bound (сложные шейдеры).
Увеличение разрешения сильнее бьёт по fill rate, чем по CPU.