Як ми вирішуємо великі вимоги до відеопам'яті у 2D грі?
Ми розробляємо 2D гру (Factorio) в алегро C / C ++, і ми зіткнулися з проблемою із збільшенням вимог до відеопам'яті, оскільки вміст гри збільшується.
Наразі ми збираємо всю інформацію про зображення, які будуть використані спочатку, обрізаємо всі ці зображення якомога більше і впорядковуємо їх у великі атласи якомога щільніше. Ці атласи зберігаються у відеопам'яті, розмір якої залежить від системних обмежень; В даний час це, як правило, 2 зображення розміром до 8192x8192, тому для них потрібно від 256 Мб до 512 Мб відеопам'яті.
Ця система працює для нас досить добре, так як за допомогою деяких спеціальних оптимізацій та розділення потоку візуалізації та оновлення ми можемо намалювати десятки тисяч зображень на екрані за 60 кадрів в секунду; у нас на екрані багато об'єктів, і дозволити велике зменшення масштабу - важлива вимога. Як ми хотіли б додати більше, виникають певні проблеми з вимогами до відеопам'яті, тому ця система, можливо, не може працювати.
Одна з речей, яку ми хотіли спробувати, - це мати один атлас з найпоширенішими зображеннями, а другий - кеш-пам'ять. Зображення будуть переміщені туди з растрового зображення пам'яті на вимогу. З цим підходом є дві проблеми:
- Малюнок з растрового зображення пам'яті на відео растрове зображення болісно повільний, в алегро.
- Не можна працювати з відео растровим зображенням, крім основного потоку, в алегро, тому він практично непридатний.
Ось деякі додаткові вимоги, які ми маємо:
- Гра повинна бути детермінованою, тому питання про продуктивність та час завантаження ніколи не можуть змінити стан гри.
- Гра в реальному часі, і незабаром також буде багатокористувацькою. Нам потрібно уникати навіть найменшого заїкання будь-якою ціною.
- Більшість гри - це один безперервний відкритий світ.
Тест складався з малювання 10 000 спрайтів у партії розмірами від 1х1 до 300х300, кілька разів для кожної конфігурації. Я робив тести на Nvidia Geforce GTX 760.
- Відео-растрове зображення для малювання растрового зображення відео займало 0,1 мс на спрайт, коли вихідний растровий файл не змінювався між окремими растровими зображеннями (варіант атласу); розмір не мав значення
- Відео растрове зображення для графічного растрового відео, тоді як вихідне растрове зображення перемикалось між малюнками (не атласний варіант), займало 0,56 у.о. за спрайт; розмір не мав значення.
- Растрова пам'ять для малювання растрових відео дійсно була підозрілою. Розміри від 1x1 до 200x200 займали 0,3us за растрову карту, так що не так жахливо повільно. Для більших розмірів час почав дуже різко збільшуватися - у 9us за 201x201 до 3116us за 291x291.
Використання атласу збільшує продуктивність на коефіцієнт, більший за 5. Якщо для рендерінгу у мене було 10 мс, то в атласі я обмежений 100 000 спрайтів на кадр, а без нього - обмеження в 20 000 спрайтів. Це було б проблематично.
Я також намагався знайти спосіб тестування растрової карти та формату біт-мапи 1bpp для тіней, але мені не вдалося знайти спосіб зробити це в allegro.