Применение технологий

mlefagdc2cgsh6h9o0coyq8ul2m.jpeg

Решили мы как-то сделать браузерную игру. Мы поставили себе амбициозную задачу: многопользовательский шутер работающий прямо в браузере, без плагинов, и, даже на интегрированой видеокарте.


Уровень графики планировался быть не хуже, чем у игр Valve сделаных на движке Source 2004 года — CS 1.6, Half-life (самый первый) — даже два года назад создание игры с качеством графики 15 летней давности мы понимали как что-то очень сложное для веб-платформы. Мы хотели сделать игру высокой доступности, которая должна работать на любом утюге с wifi!

Для первых прототипов использовали движок Three.js в связке с Ammo.js (wasm порт библиотеки физики и коллизий Bullet).

В процессе разработки мы пришли к выводу, что по уровню оптимизации выбранные технологии не отвечают нашим требованиям. Было похоже, что разработчики движков не пытались делать игры на своем движке. Кумулятивно, выбранные технологии снижали производительность в разы от возможной.

Первое, что мы поняли в тот момент, движок нужно писать под игру, а не заниматься приспособлением игры под чужие универсальные движки. Нам не нужны были обширные возможности, а нужно было, чтобы наша игра работала быстро и выглядело красиво.

Итак, мы пришли к тому, чтобы написать свой движок.

В какой-то момент мы понимаем, что WebGL рендерет в текстуру, делает ридбэк и потом опять отправляет на видеокарту. Что за чепуха, спросите вы. Но так и есть. Данные гоняются между ОЗУ и видео памятью каждый кадр, а там чертовы мегабайты всё таки. И каждый рендер создает не шуточную нагрузку на шину. Так вот всё устроено. А мы хотели PBS-шейдеры использовать… и постэфекты… Производительность течет по голове…

К черту постэффекты!

Берем за основу идеи движков Source ½: освещение статических объектов запекается в текстуры или в буферы геометрии, а динамические объекты обрабатываются отдельно. Никакого динамического освещения на окружении.

В отличии от стандартных систем рендеринга, где свет считается в реальном времени, а потом рендерятся слои постэфектов в несколько проходов — мы делаем полноэкранный рендер и всё!

Столкновение с технологической реальностью дает результаты: у нас появляется честное глобальное освещение, дешевое в плане производительности и производства.
GI нам дает:
— реализм, картинка стала выглядеть естественно
— мягкое освещение
— простое управление большим количеством источников света
— вместо миллионов отработок длинных пиксельных шейдеров мы получили десятки тысяч отработок коротких вершинных шейдеров

Отказ от постобработки и рендера в текстуры нам также дает возможность использовать MSAA. Хм — мы и забыли когда последний раз его видели в играх — апаратное сглаживание изображения!
Хотя всё получалось хуже по мелким деталям, общая картина сильно улучшилась. Появилось световой объем, такое освещение, что глаз начал верить.

cd7wkrnkghypjkdoazglatr44ck.jpeg
krr-e0hcocfr22xlkkpc3qyqet8.jpeg
lcmokqgctmzfsnrccj4rf0ihcv8.jpeg

Пишем движок дальше.
__________________________________
После этого записи обрываются…

© Habrahabr.ru