Как сделать игру, способную работать на видеокарте? И стоит ли? (2 фото + 1 видео)
Главная фишка новинки – это физическая симуляция, выполняющаяся на графическом процессоре. Шесть тысяч строк написано на HLSL, основной же код - compute shader. Здесь взаимодействуют десятки тысяч частиц, обрабатывающихся параллельно и при этом довольно шустро. В игре вообще все создано из таких частиц.
Видеосюжет с проигрышем ее части можно посмотреть на YouTube. Здесь же хотелось бы просуммировать полученный опыт. И подвести итоги: с плюсами и минусами вычислений прямо на видеокарте.
О плюсах и минусах
Плюс один, но очень существенный. У GPU производительность в десятки, а то и в сотни раз превышает показатели процессора, если речь идет о параллельных вычислениях. Это невероятно важно, поскольку видеокарта позволяет делать принципиально иные игры, нежели процессор. В нашем примере игра на CPU вообще не работала бы – или велась бы слишком медленно.
Из минусов – нехватка информация в сети. Разработчикам требуется слишком много времени на изучение даже основ, а также на исправление появляющихся проблем. Технология программирования в данном случае вообще сложнее. Вещи, которые привычны для процессорного вычисления, на графическом ядре не всегда работают.
Скажем, 3-мерный цикл с 3-мерным массивом приходится заменять на 3-мерное пространство потоков, которые одновременно обрабатывают 1-мерный массив. В последний приходится раскладывать исходный 3-мерный. Приходится думать и о работе в защищенном режиме параллельных потоков с общими данными. Решить все это можно, но сложно и долго.
Не так уж и просто также читать данные из видеопамяти. Делать это нужно на каждом цикле, однако работает все слишком медленно. Дело в том, что в юнити не имелось асинхронного чтения в моменты времени, которые удобны графическому конвейеру. При чтении данных он все время блокировался.
Как результат – падение fps вдвое. В такой ситуации выручает нативный плагин, позволяющий средствами directX читать асинхронно прямо из видеопамяти. Правда, вне Windows это не работало. Равно как и на ряде видеокарт – по непонятным даже для разработчиков причинам.
Кроме того, не все имеют видеокарты, которые достаточно современны: поддерживают шейдеры, а также обладают должной производительностью. Круг людей, способных поучаствовать в разработанной таким образом игре, при этом существенно ограничивается.
На различных платформах есть несколько разные графические API. В ситуациях попроще они стыкуются со стандартом directX. Но так везет не всем. Скажем, на андроиде, Vulkan, Metal – везде свои собственные ограничения. В результате игра может работать лишь на Windows.
И последнее: обеспечить детерминированность вычислений получается не всегда. А значит от мультиплеера придется отказаться.
Подведем итог
По сути же, все не так уж и плохо. Весьма любопытно разобраться, как это – играть в абсолютно физической среде, подверженной разрушению. Конечно, в идеале должны быть совместимыми все графические API. Но есть надежда, что в будущем это произойдет.
Технология эта весьма полезна, так как дает невероятный выигрыш производительности. При этом делать по ней целую игру совсем необязательно. Часто достаточно перенести в видеопроцессор видеообработку лишь некоторых ее частей. Скажем, в стратегиях это может быть поиск пути.
Пока же далеко не все разработчики согласятся создавать compute shader. Ведь его все равно нужно дублировать – на случай, если игру запускают на платформе, которая не поддерживает вычисления на видеокарте. Если же кому-либо захочется испытать себя в новой области, несколько туториалов найти все-таки можно.
- Знаменитые картёжники отечественного кино
- Создателя Counter-Strike задержали по подозрению в растлении несовершеннолетнего
- Теперь каждый, кто считает выборы честными, может побрить Грудинина
- Фотограф снимал 'жизнь' стола для пинг-понга в течение 5 лет, и там было всё, кроме игры
- Всем поклонникам World of Warcraft посвящается