5115

Доделал игру, работающую на видеокарте

Наконец-то я доделал игру, которая работает на видеокарте. Она несколько месяцев повисела в раннем доступе на стиме, и теперь я её окончательно выпустил.


Основная особенность игры в том, что она представляет собой физическую симуляцию, которая выполняется на графическом процессоре. Основной код игры - это огромный compute shader, 6 тысяч строк на HLSL. Десятки тысяч взаимодействующих частиц обрабатываются параллельно, и выходит довольно быстро. Всё в игре сделано из этих частиц. Вот видосик с геймплеем:

Хочется просуммировать опыт разработки такого рода игры. Какие достоинства и недостатки у вычислений на видеокарте.


Достоинства:


1. Производительности GPU в 10-100 раз выше, чем у процессора, когда дело касается параллельных вычислений. Это очен много, так что на видеокарте можно делать принципиально другие игры, чем на процессоре. Моя игра просто не работала бы на CPU (то есть, была бы слишком медленной).


Недостатки:


1. Мало туториалов. Я потратил довольно много времени, чтобы всё изучить. И ещё больше - чтобы решить возникавшие проблемы.


2. Это в принципе сложнее, программировать для графиеского ядра. Привычные для процессорного вычисления вещи могут не работать. Например, вместо трёхмерного цикла на трёхмерном массиве я должен был делать трёхмерное пространство потоков, одновременно обрабатывающих одномерный массив (в который пришлось разложить исходный трёхмерный). Кроме того, надо заботиться, чтобы параллельные потоки работали с общими данными в защищённом режиме. В целом всё это решаемо, но требует больше времени.


3. Проблемы возникли и при чтении данных из видеопамяти. Это приходилось делать на каждом цикле, но работало оно слишком медленно. Потоу что в юнити не было асинхронного чтения в удобное для графического конвейра время, и он постоянно блокировался при чтении данных. В итоге fps падал вдвое. Пришлось использовать нативный плагин для асинхронного чтения из видеопамяти средствами directX, но во-первых, это не работало вне windows, а во-вторых, по неизвестным причинам это не работало на некоторых видеокартах, игроки жаловались.


4. Не у всех есть достаточно современные видеокарты, поддерживающие шейдеры и обладающие достаточной производительностью. Это ограничивало круг игроков, способных поиграть в мою игру.


5. Графические API на разных платформах немного отличаются друг от друга. В простых случаях они совместимы со стандартом directX, но у меня - не простой случай. У Metal одно небольшое ограничение, на андроиде - другое, на Vulkan - третье. В итоге, моя игра работает только на Windows.


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


Но по итогам, я всё-таки доволен, что сделал что хотел. Очень интересно было посмотреть, каково играть в полностью физической, разрушаемой среде. Было бы неплохо, если б все графические API были совместимы, надеюсь, в будущем это всё устаканится. Потому что технология очень полезная из-за гигантского выигрыша в производительности. Вовсе не обязательно делать целую игру, можно перенести некоторые части игры на обработку в видеопроцессор. Например, поиск пути в стратегиях. А сейчас не любой разработчик будет готов писать compute shader, если всё равно его придётся дублировать, на случай, если игра запущена на платформе, не поддерживающей вычисление на видеокарте.


Ну и если кто-то вдруг захочет попробовать свои силы в этой области, то вот парочка туториалов:


http://kylehalladay.com/blog/tutorial/2014/06/27/Compute-Sha...


http://www.emersonshaffer.com/blog/2016/5/11/unity3d-compute...

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"