- PVSM.RU - https://www.pvsm.ru -

Разработка игр на Rust. Обзор экосистемы

Здравствуйте! Я занимаюсь разработкой игры на Rust и хочу рассказать об этом.

Моя первая статья будет полезна тем, кто хочет начать делать игру на Rust, но не уверен, какие из пакетов (крейтов [1]) стоит использовать и что в общем происходит в экосистеме Rust для игрового разработчика.

Небольшое отступление — зачем всё это? Есть же готовый X?

Под впечатлением вот этого выступления, я начал писать свой игровой движок на Haskell. Далеко дело не зашло, но я написал рендер моделек, простое освещение, немного сети.

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

Но, с Haskell было несколько проблем — для вывода 3д в реальном времени он достаточно медлителен. Не было сообщества занимающегося на нём играми. Не хватало нужных для игр библиотек.

С Rust же всё пошло куда веселее.

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

  • мощная, но при этом простая система типов;

  • абстракции бесплатны по перфомансу — не надо платить за те абстракции, которые не используешь в явном виде;

  • простая и безопасная многопоточность;

И при этом на нём очень просто писать код, язык маленький и простой.

Вернусь к экосистеме:

Работа с окнами:

Glutin [2] — раст-альтернатива GLFW [3], используется в Servo [4], активно развивается. Создаёт окна на win/osx/linux/android. На ios еще не работает, кто-то хотел сделать, но с 2015 об этом желающем не слышно.

И есть биндинги к не-растовым библиотекам: glfw-rs [5] rust-sdl2 [6] rust-sfml [7] (сайт [8]). Все три живы и поддерживаются.

Графические API:

Есть возможность использовать напрямую OpenGL [9]/DirectX [10]/Vulkan [11], к тому же уже созданы растоспецифичные графические библиотеки.

Glium [12] — безопасная обёртка над OpenGL, по факту — в основном над OpenGL 3, хорошо поддерживаются OpenGL < 4 и OpenGL ES. Поддержкой всех хитростей четвертой версии OpenGL автор заниматься не планирует, он считает, что тогда лучше сразу браться за Vulkan. Развивается в настоящий момент достаточно неспешно — автор в основном занимается своей игрой на вулкане.

Тем не менее на PC glium со своими функциями справляется — на нём действительно удобно писать OpenGL код.

Есть целый учебник [13]. Он не полон, но по началу очень полезен.

Vulkano [14] — аналог glium, но для Vulkan [15]. Именно им занят автор glium, разработка идёт очень активно. С презентацией vulkano можно ознакомиться здесь [16].
Gfx [17] — универсальное API без привязки к графическому бэкэнду. Сейчас работает поверх OpenGL и DirectX, в скором времени планируется Metal [18] и Vulkan. Разрабатывается активнее glium. С gl es и мобильными устройствами в данный момент всё чуть хуже, чем в glium, но прямо сейчас ведутся очень активные работы в эту сторону.

Gfx и Glium отличаются по поставленным задачам — glium просто предоставляет api к стабильному opengl, gfx же сконцентрирован на своём универсальном и типобезопасном api к самым современным графическим бэкендам.

Kiss-3d [19] — маленький, простой графический движок. Не богат на функционал, но к этому и не стремится. Позволяет создавать окна и рисовать графические примитивы. Выглядит поддерживаемым, но активной разработки не замечено. С другой стороны — оно уже полностью готово, свои функции выполняет.

Готовые графические движки:

Piston [20] PistonDevelopers [21] — по сути, это огромное количество проектов объединенных общей целью — стать, когда-нибудь, модульным игровым движком. "Не в каждом раст проекте есть пистон целиком, но в каждом есть немного пистона" (“No Rust game project uses most of Piston, but most uses some of it!”).

Основной разработчик последние месяцы занимается исключительно своим скриптовым языком Dyon и демо играми на нём (asteroids [22]).

В куче репозиториев PistonDevelopers есть что-то почти готовое, но, по большей части, оно всё очень разрозненное и далеко от какого-то практического использования.

Amethyst [23] — намного моложе Piston, еще далёк от использования по назначению, однако активно развивается. Дизайн вдохновлён BitSquid/Stingray (от Autodesk). Уже есть графический пайплайн, forward/deffered rendering, asset pipeline, конфигурация через yaml. Основной разработчик пропал, но сообщество очень активно пилит дальше.

Математические библиотеки:

Cgmath [24] — используется в примерах и gfx, и glium. Хочет стать основной математической библиотекой для игр на Rust.
Nalgebra [25] — используется в ncollide и nphysics. По большей части используется там, где нужен ncollide/nphysics.

И то и то работает, все основные операции есть.

Glm-rs [26] — насколько я знаю, использовалась до cgmath с nalgebra, просто биндинги к довольно известному GLM.

Поиск коллизий:

Collision-rs [27] — система поиска коллизий, использует cgmath. Создавалась как часть cgmath. В отличие от остального cgmath так себе сопровождалась и была вынесена в отдельный крейт. Реализована далеко не вся нужная функциональность, тестовое покрытие так себе, но, зато, построено на cgmath, не надо тащить две разные математические библиотеки.
ncollide [28] — система коллизий от nphsysics, использует nalgebra. Развивается активно, имеет красивый сайт [29]. Тестируется и развивается всеми пользователями nphysics.

Entity-component-system:
https://shaneenishry.com/blog/2014/12/27/misconceptions-of-component-based-entity-systems/ [30]
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/ [31]
Довольно популярная идея для проектирования игр, уже есть готовые растовые реализации:

Specs (https://github.com/slide-rs/specs [32]) — единственная действительно многопоточная ecs. Достаточно активно развивается, используется в amethyst.
https://crates.io/keywords/ecs [33] — целая куча систем, существовавших до specs, каждая со своими нюансами, описывать каждую — тема для отдельной статьи.

Когда я начинал specs еще не было, и я написал свой велосипед [34].

Работа с ресурсами:

obj [35] — растовая реализация .obj, работает :)
Assimp [36] — биндинги к assimp — библиотеке работающей с кучей 3д форматов
image [37] — растовая реализация популярных форматов 2д. Работает, но есть нюанс — в cargo нет возможности подключить бинарную/релизную версию зависимости к отладочной сборке. Из-за чего отладочный Image ну очень долго открывает картинки в отладочных сборках. С релизными сборками проблем нет. Ждём пока cargo научится использовать зависимости с другими параметрами.
stb-image [38] — биндинги к сишной библиотеке по работе с картинками. По функционалу — аналог image, но решает проблему отладочных зависимостей — даже в отладочных сборках работает быстро, потому что сишный код собирается со своими собственными флагами.
zip-rs [39] — просто zip архиватор, cжимать ресурсы.

Работа со звуком:

ears [40] — просто биндинги к OpenAl. Я пользуюсь именно им, для звуков — всё отлично.
vorbis [41] — биндинги к vorbis.
rodio [42] — более высокоуровневая работа с vorbis.

GUI:

С гуи дела обстоят не очень. Идеальной игровой гуи библиотеки пока что не существует. Однако, есть:

Imgui [43] — биндинги к imgui. Отлично работают вместе с glium. Но заточен для инструментария разработчика, не поддерживает скины, неудобно верстать нестандартные окна.
Awesomium [44] awesomium-rs [45] — дорого для не инди, C API есть только у древней версии. Но работает достаточно быстро, api — удобное.

Скелетная анимация:

skeletal_animation [46] — есть у Piston, но уже заброшен. В json описывается граф анимаций, немного похожий на Mecanim из Unity. Поддерживает gpu-скиннинг. Но, к сожалению, есть зависимости и на piston, и на gfx — не так просто интегрировать в проект на glium.

Физика:

Поскольку я делаю игру про физику — для меня это важный вопрос. Для раста есть только github.com/sebcrozet/nphysics [47].
Nphysics состоит из nphysics2d и nphysics3d. Для 2д, говорят, хватает, а вот в 3д дела не очень — до того же Bullet по возможностям еще далеко, приходилось довольно много дописывать. Однако, работы идут и идут достаточно активно.
Хочется использовать Bullet, но к актуальной версии C API еще нет, ждём [48].

Инструментарий:

cargo-apk [49] — дополнение к cargo, позволяющее создавать android apk файл + библиотека по работе с окружением Android из кода.
cargo-profiler [50] — использование valgrind через cargo.
hprof [51] — фрейм профайлер, не найдя hprof я написал свой такой же, но хуже — tinyprof [52]. Очень удобно смотреть что происходит в каждом кадре [53].

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

С IDE же дела обстоят так:

Есть racer [54], отдельный проект, предоставляющий редакторам данные для автодополнения и простейшей навигации. По функционалу он еще не дотягивает даже до ghc-mod. Существуют плагины для всех популярных редакторов (Vim, Emacs, Atom, VS Code и т.д.).
Уже запланирован полноценный ide-backend ‘Oracle’. Это тот же racer, но с поддержкой в компиляторе и более работающий.

Плагины для eclipse и visual studio могут в полноценную отладку — ходьбу по шагам итд.

Можно посмотреть результаты опроса [55] по популярным IDE. Результаты странные — идеевский плагин (насколько я знаю) один из самых бедных по функционалу — просто обвязка над racer.

Подробнее про состояние дел можно прочитать тут [56].

Открытые игры в разработке:

https://github.com/bfops/playform [57]
https://github.com/ozkriff/zoc [58]
https://github.com/kvark/vange-rs [59]
https://github.com/PistonDevelopers/hematite [60]
https://github.com/kvark/claymore [61]
https://github.com/PistonDevelopers/piston/wiki/Games-Made-With-Piston [62]

Наша игра:

В начале статьи видео геймплея нашей игры — это сетевой шутер с синхронной разрушаемостью. Мы пока что в пре-альфе, готовимся к публичной альфе, плейтестам. Ищем людей ;)

Сообщество:

Дружелюбное раст-геймдев сообщество всегда радо ответить на вопросы в irc [63] (#rust-gamedev) или в русскоязычном гиттере: gitter.im/ruRust/gamedev [64].

Автор: FL3

Источник [65]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/gamedev/144558

Ссылки в тексте:

[1] крейтов: https://crates.io/

[2] Glutin: https://github.com/tomaka/glutin

[3] GLFW: http://www.glfw.org/

[4] Servo: https://servo.org/

[5] glfw-rs: https://github.com/PistonDevelopers/glfw-rs

[6] rust-sdl2: https://github.com/AngryLawyer/rust-sdl2

[7] rust-sfml: https://github.com/jeremyletang/rust-sfml

[8] сайт: http://www.rust-sfml.org/

[9] OpenGL: https://github.com/bjz/gl-rs

[10] DirectX: https://crates.io/crates/d3d11-sys

[11] Vulkan: https://crates.io/crates/vk-sys

[12] Glium: https://github.com/tomaka/glium

[13] учебник: https://www.google.com/url?q=http://tomaka.github.io/glium/book/&sa=D&ust=1467022385555000&usg=AFQjCNGmYkL9vtsO3UCAwfnwP9Nfp2pT-A

[14] Vulkano: https://github.com/tomaka/vulkano

[15] Vulkan: https://ru.wikipedia.org/wiki/Vulkan_(API)

[16] здесь: https://users.rust-lang.org/t/presentation-of-the-vulkano-library/5642

[17] Gfx: https://github.com/gfx-rs/gfx

[18] Metal: https://en.wikipedia.org/wiki/Metal_(API)

[19] Kiss-3d: https://github.com/sebcrozet/kiss3d

[20] Piston: http://www.piston.rs/

[21] PistonDevelopers: https://github.com/PistonDevelopers

[22] asteroids: https://github.com/PistonDevelopers/dyon_asteroids

[23] Amethyst: https://github.com/amethyst/amethyst

[24] Cgmath: https://github.com/bjz/cgmath

[25] Nalgebra: https://github.com/sebcrozet/nalgebra

[26] Glm-rs: https://github.com/dche/glm-rs/

[27] Collision-rs: https://github.com/csherratt/collision-rs

[28] ncollide : https://github.com/sebcrozet/ncollide

[29] сайт: http://ncollide.org/

[30] https://shaneenishry.com/blog/2014/12/27/misconceptions-of-component-based-entity-systems/: https://shaneenishry.com/blog/2014/12/27/misconceptions-of-component-based-entity-systems/

[31] http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/: http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/

[32] https://github.com/slide-rs/specs: https://github.com/slide-rs/specs

[33] https://crates.io/keywords/ecs: https://crates.io/keywords/ecs

[34] велосипед: https://github.com/not-fl3/tinyecs

[35] obj: https://github.com/csherratt/obj

[36] Assimp: https://github.com/Eljay/assimp-rs

[37] image: https://github.com/PistonDevelopers/image

[38] stb-image: https://github.com/servo/rust-stb-image

[39] zip-rs: https://github.com/mvdnes/zip-rs

[40] ears: https://github.com/jhasse/ears

[41] vorbis: https://github.com/tomaka/vorbis-rs

[42] rodio: https://github.com/tomaka/rodio

[43] Imgui: https://github.com/Gekkio/imgui-rs

[44] Awesomium: http://www.awesomium.com/

[45] awesomium-rs: https://github.com/not-fl3/awesomium-rs

[46] skeletal_animation: https://github.com/PistonDevelopers/skeletal_animation

[47] github.com/sebcrozet/nphysics: https://github.com/sebcrozet/nphysics

[48] ждём: https://github.com/bulletphysics/bullet3/issues/130

[49] cargo-apk: https://users.rust-lang.org/t/announcing-cargo-apk/5501

[50] cargo-profiler: https://github.com/pegasos1/cargo-profiler

[51] hprof: https://github.com/cmr/hprof

[52] tinyprof: https://github.com/not-fl3/tinyprof

[53] кадре: http://i.imgur.com/7YaDWuA.jpg?1

[54] racer: https://github.com/phildawes/racer

[55] опроса: https://ru.surveymonkey.com/results/SM-Y6C57MBR/

[56] тут: https://www.rust-lang.org/ides.html

[57] https://github.com/bfops/playform: https://github.com/bfops/playform

[58] https://github.com/ozkriff/zoc: https://github.com/ozkriff/zoc

[59] https://github.com/kvark/vange-rs: https://github.com/kvark/vange-rs

[60] https://github.com/PistonDevelopers/hematite: https://github.com/PistonDevelopers/hematite

[61] https://github.com/kvark/claymore: https://github.com/kvark/claymore

[62] https://github.com/PistonDevelopers/piston/wiki/Games-Made-With-Piston: https://github.com/PistonDevelopers/piston/wiki/Games-Made-With-Piston

[63] irc: https://wiki.mozilla.org/IRC

[64] gitter.im/ruRust/gamedev: https://gitter.im/ruRust/gamedev

[65] Источник: https://habrahabr.ru/post/303976/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best