- PVSM.RU - https://www.pvsm.ru -
Здравствуйте! Я занимаюсь разработкой игры на 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/
[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
[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
Нажмите здесь для печати.