Уже почти полгода пишу игровой движок на расте и игру на нем.
Особенности
- Стабильность - нет падений связанных с неверной работой с памятью (классическая причина падения всех игр).
- Скорость - движок такой же быстрый как если бы он был написан на C/C++ - я портировал почти все из своего сишного движка и в скорости движок не потерял, в некоторых местах получилось даже быстрее.
- Полноценный граф сцены
- Поддержка FBX из коробки
- Поддержка TTF шрифтов из коробки
- Автоматическое управление ресурсами
- Встроенный сериализатор - сохранение\загрузка состояния движка за один вызов.
- Продвинутый node-based GUI с кучей виджетов
- Deferred renderer (bump mapping, spot and point lights)
- Скелетная анимация
- Перенос анимаций (animation retargetting)
- и многое другое
Скриншотики
Все скриншоты сделаны в rusty-shooter
Почему раст?
Надежность, скорость и безопасная многопоточность. C++ обеспечивает разве что скорость, ни о какой надежности и безопасной многопоточности там и речи нет.
Репозиторий
Движок - https://github.com/mrDIMAS/rg3d
Игра - https://github.com/mrDIMAS/rusty-shooter
Интересно, очень. Имеет смысл учить Rust?
Почитал про Rust. Довольно неплохо. Вижу, что уже есть один движок в экземплах. Я так понимаю, что он примитивный, и твой намного лучше?
Годно. Приятно видеть рост популярности раста.
Вечером приду домой и поизучаю исходники.
mr.DIMAS
Как там со временем компиляции?
Сколько строк/секунду?
Если бы не синтаксис руста, то был бы вполне себе годный ЯП.
nes
> Если бы не синтаксис руста, то был бы вполне себе годный ЯП.
Как же я с тобой согласен. Вроде бы и хочется пощупать Rust, интересно же ведь, но как только вижу код — сразу хочется забыть увиденное.
Народу не лень писать не только самописные игровые движки, но и языки для их написания...
Безумие какое то. И сразу вспоминается миф о вавилонской башне.
Robotex
> Имеет смысл учить Rust?
Определенно стоит, на нем (safe-Rust, без unsafe блоков) не получится сделать типичный спагетти-код как в плюсах или языках со сборщиком мусора. Концепция владения и заимствования заставляет четко продумывать архитектуру, и сразу становятся очевидными недостатки типичных подходов. Чтобы понять всю прелесть это достаточно просто прочитать небольшой кусок из книги про заимствования и ссылки - https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html . Вкратце - невозможно создать висячую ссылку, невозможно создать несколько изменяемых ссылок на один и тот же объект - последнее особенно классно потому что в таком случае не получится модифицировать коллекцию при ее обходе и еще куча всего прикольного.
Robotex
> Я так понимаю, что он примитивный, и твой намного лучше?
На самом деле есть два довольно больших движка
1) Piston - игры на нем - довольно примитивные, несмотря на то что движок довольно популярен.
2) Amethyst - игры на нем в общем-то тоже довольно примитивные, отличается тем что у него есть спонсоры которые каждый месяц отсыпают денег на его разработку.
Вообще мне не ясно почему разработчики этих движков делают движок ради движка и не делают на нем какую-нибудь относительно большую игру одновременно, как по мне это сильно отпугивает новичков - куда ни посмотри движок делается много лет (Piston - 5 лет, Amethyst - 3.5 года) а игр на нем раз-два и обчелся и те довольно слабенькие. Тут вроде кто-то говорил что для привлечения внимания к движку на нем стоит делать игру одновременно, а лучше сделать несколько шаблонов для разных жанров которые можно приспособить под свои нужды.
Мой движок пока что отличается тем что на нем уже есть хоть какая-то но более менее сложная игра - да там боты тупые, очень мало геймплея и все такое, но это как мне кажется уже больше чем то что было сделано за годы работы над другими движками. Я делаю игру в первую очередь, а движок подстраивают под нужды игры но более менее обобщенно, чтобы не получился слишком узкоспециальный движок.
Джек Аллигатор
> Годно. Приятно видеть рост популярности раста.
Спасибо! Ты же вроде тоже что-то делаешь на нем, когда покажешь уже?
CD
> Как там со временем компиляции?
> Сколько строк/секунду?
Инкрементальная компиляция довольно быстрая - на моем Ryzen 1700 (8 ядер по 3.6 ГГц) движок компилится за 11 секунд. Полная сборка с нуля со всеми зависимостями около 50 сек. Общий объем кода движка 22к строк.
nes
> Если бы не синтаксис руста, то был бы вполне себе годный ЯП.
Vlad2001_MFS
> Вроде бы и хочется пощупать Rust
По первости синтаксис тоже немного напрягал, но это первые пару недель, а потому быстро привык и стало нормально.
MSA2
> Народу не лень писать не только самописные игровые движки, но и языки для их
> написания...
https://www.rust-lang.org/production/users
mr.DIMAS
> Инкрементальная компиляция довольно быстрая
В 2017 всё было печально, в 2018 добавили эту фичу и стало приемлемо.
До раста писал на крестах и компилировал через gcc+ninja+gyp, вот там была просто космическая скорость, практически моментальный результат.
Расту до этого далеко, с другой стороны, низкая скорость компиляции с лихвой компенсируется отсутствием необходимости компилировать код после каждой новой строки кода. Если в коде нет ошибок значит он после компиляции будет работать как надо, если же ошибки есть, они подсвечиваются сразу без компиляции. Получается долго пишешь код, исправляешь подсвеченные ошибки, один раз запускаешь — работает, потом ещё час код пишешь и не паришься.
> Спасибо! Ты же вроде тоже что-то делаешь на нем, когда покажешь уже?
Ты именно исходный код хочешь посмотреть или готовые проекты?
В 2017 уже выкладывал тетрис и планету с мегатекстурами: https://gamedev.ru/flame/forum/?id=222936
Вернулся к проекту этой весной, сделал игровую карту на этой планете на 10млн тайлов без тормозов.
В процессе возникло понимание что так дальше жить нельзя, потому что пользовался только голым https://crates.io/crates/gl и получается что раст безопасен, а вот опенгл в нём — нет. Да и вообще бесит легаси стандарт, в опенгл в половине команд вместо нормальных аргументов требуется передавать указатели, и везде разных типов, без какой-либо логики. О других причинах написания своего враппера писал в соответствующей теме: https://gamedev.ru/code/forum/?id=246034
Глянул на существующие обертки — glium сырая недоделка, gfx в ранней стадии разработки, да и не люблю когда чужой код живет своей жизнью и накладывает серьезные ограничения на возможности.
Было решено написать свою максимально тонкую обертку, фактически синтаксический сахар с дополнительными проверками безопасности + типизированные инты. Ещё все неоднозначные команды, делающие разные действия в разных ситуациях, обернуты таким образом чтобы выполнять простые однозначные действия. Такого много в текстурах, например. Ну и самое главное — никакого легаси говна, только OpenGL 4.5, DSA и тд.
Затем чтобы опробовать враппер в деле, поучаствовал в конкурсе и сделал игру про эволюцию. Оказалось очень круто, код сократился раз в десять.
А сейчас gui пишу.
Выкладывать исходники не тороплюсь, потому что писал для себя, всё ещё много багов есть, а мне важнее собственные проекты неторопливо пилить, чем заниматься поддержкой и целыми днями на форумах оправдываться в духе "а чего это ты вот так написал, так не принято". Пускай будет не опенсорс но именно так, как мне удобно.
mr.DIMAS
> C++ обеспечивает разве что скорость, ни о какой надежности и безопасной
> многопоточности там и речи нет.
Ну да как бэ нужно видеть и знать что делаешь, но эта проблема сильно преувеличена и может напугать разве что только джуна.
mr.DIMAS
Как попробовавший и то и то скажи насколько реально/эффективно писать на С/С++ имитируя/используя подходы раста в области управления памятью?
Джек Аллигатор
> получается что раст безопасен, а вот опенгл в нём — нет.
Ха, у меня по первости опенгл был источником постоянных крашей, но потом я его изолировал в простенькие обертки и теперь все стабильно.
Джек Аллигатор
> А сейчас gui пишу.
UI это реально боль в расте, потому что типичные подходы (колбеки) не работают из-за borrow checker'a - в итоге я все переделал на события. Например нажата кнопка - кидаешь событие в общую очередь, все другие виджеты могут на него как-то среагировать, или например изменилось выделение в ListBox - тоже кидаешь событие с индексом выделенного элемента.
gamedevfor
> Ну да как бэ нужно видеть и знать что делаешь
Когда тебе в этом помогает компилятор и следит за правильностью, то писать код становится легче и ошибки практически исключаются.
exchg
В однопоточных программах следить за правильностью в плюсах относительно просто (исключая конечно всякие возможности поменять коллекцию при итерировании по ней, возможность создать висячую ссылку). Приколы начинаются при распараллеливании - тут часто ошибаются даже самые опытные программисты, раст же следит за тем что в программе нет гонок за данные (в то же время взаимную блокировку потоков можно получить на раз-два) - так как невозможно создать более чем одну изменяемую ссылку на данные. Это кстати добавляет возможность лучше оптимизировать программу, потому что по сути получается что области памяти никогда не пересекаются при выполнении кода.
mr.DIMAS
> - Стабильность - нет падений связанных с неверной работой с памятью
> (классическая причина падения всех игр).
классическая проблема это кривые руки - зачем нам следить за мемликами ?