На каком языке написан rust игра

Обновлено: 04.07.2024

Rust оказывается самым любимым языком по версии StackOverflow шесть лет подряд. В чём его секрет? Короткий ответ — Rust избавлен от болевых точек, которые есть во многих современных языках программирования.

Мы рассмотрим несколько примеров того, как Rust справляется с проблемами других языков и его недостатки, которые тоже присутствуют.

Наследник динамически типизированных языков

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

Развитие таких языков, как TypeScript и наличие таких возможностей, как аннотации типов в Python, свидетельствуют о том, что люди разочаровались в текущем состоянии динамической типизации.

Senior Software Engineer, Database Engineering (Cube Core)

Cube Dev , Удалённо , От 6000 $

Статически типизированные языки позволяют использовать ограничения на данные и их поведение, проверяемые компилятором, что снижает когнитивные издержки и недопонимание.

Однако не все способы статической типизации эквивалентны. Многие статически типизированные языки поддерживают концепцию NULL.

Это значит, что любое значение может отсутствовать, таким образом создавая второй возможный тип для каждого типа. Как Haskell и некоторые другие современные языки программирования, Rust реализует эту возможность с помощью типа optional, и компилятор требует, чтобы вы указывали case None.

Статическая типизация в Rust делает все возможное, чтобы не мешать программисту, при этом обеспечивая поддержку. Некоторые языки со статической типизацией ложатся большой нагрузкой на программиста, требуя многократного повторения типа переменной, что препятствует удобочитаемости и рефакторингу. Другие статически типизированные языки допускают вывод типа во всей программе.

Хотя это удобно в начале разработки, снижается способность компилятора предоставлять полезную информацию об ошибках, в случае несовпадения типов. Rust учится на обоих этих стилях и требует, чтобы элементы верхнего уровня, такие как аргументы функций и константы, имели явные типы, позволяя при этом выводить типы внутри тел функций. В этом примере компилятор Rust может определить тип дважды, 2 и 1, поскольку параметр val и возвращаемый тип объявлены как 32-разрядные целые числа со знаком.

Наследник языков со сборщиком мусора

Одним из самых больших преимуществ использования системного языка программирования является возможность контролировать низкоуровневые детали.

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

Обладая прямым доступом к оборудованию и памяти, Rust является идеальным языком для разработки встраиваемых и bare-metal систем. Вы можете писать код чрезвычайно низкого уровня, например ядра операционной системы или приложения для микроконтроллеров. Основные типы и функции Rust, а также переиспользуемый библиотечный код отлично работают в этих особенно сложных средах.

Наследник языков системного программирования

Большинство людей рассматривают Rust как альтернативу таким языкам системного программирования, как Си или C++. Самое большое преимущество Rust — это проверка заимствований. Это часть компилятора, ответственная за то, чтобы ссылки не переживали данные, на которые они ссылаются, это помогает устранить целые классы ошибок, вызванных небезопасным использованием памяти.

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

В тех случаях когда безопасного Rust недостаточно мы можете использовать небезопасный Rust. Это даёт дополнительные возможности, однако вы сами должны следить за тем, что код безопасен. Этот код затем может быть заключен в абстракции более высокого уровня, которые гарантируют, что все виды использования абстракции безопасны.

Использование небезопасного Rust должно быть обдуманным решением, поскольку его правильное использование требует столько же размышлений и осторожности, как и в любом другом языке, в котором вы несете ответственность за предотвращение неопределенного поведения. Сведение к минимуму небезопасного кода — лучший способ свести к минимуму возможности сбоев и уязвимостей из-за небезопасности памяти.

Языки системного программирования подразумевают, что они будут эффективно существовать вечно. В то время как некоторые современные разработки не требуют такого срока службы, многие компании хотят знать, что их фундаментальная база кода будет пригодна для использования в обозримом будущем. Rust признает это и принял сознательные дизайнерские решения, касающиеся обратной совместимости и стабильности; это язык, разработанный на ближайшие 40 лет.

Экосистема Rust

Rust больше, чем спецификация языка и компилятор; многие аспекты создания и поддержки программного обеспечения промышленного качества рассматриваются как объекты первого класса. С помощью rustup можно установить несколько параллельных цепочек инструментов Rust и управлять ими. Rust поставляются с Cargo — инструментом командной строки для управления зависимостями, запуска тестов, создания документации и многого другого. Поскольку зависимости, тесты и документация доступны по умолчанию, их использование широко распространено. crates.io — это сайт сообщества для обмена и поиска библиотек Rust. Любая библиотека, опубликованная в crates.io будет иметь свою документацию на docs.rs.

Кроме встроенных инструментов, коммьюнити Rust создало множество средств разработки. Бенчмаркинг, анализ и тестирование на основе свойств — все это легко легко использовать в проектах. Дополнительные линты компилятора доступны в Clippy, а автоматическое форматирование обеспечивается rustfmt. Поддержка IDE хороша и с каждым днем становится всё более эффективной.

Rust имеет яркое, гостеприимное сообщество. Существует несколько официальных и неофициальных способов получить помощь, таких как чат, форум, сабреддит Rust и, конечно же, Stack Overflow. У Rust есть кодекс поведения, который соблюдается потрясающей командой модераторов, поэтому официальные порталы и большинство неофициальных располагают к себе.

В оффлайне Rust проводит множество конференций по всему миру, таких как RustConf, Rust Belt Rust, RustFest, Rust Latam, RustCon Asia и другие.

Не всё так просто

Особенно часто можно услышать, как кто-то жалуется, что он «борется с проверкой заимствований». Хотя эти ошибки могут обескураживать, важно признать, что каждое из выявленных мест потенциально могло привести к ошибкам и потенциальным уязвимостям.

В этом примере мы создаем изменяемую строку, содержащую имя, затем берем ссылку на первые три байта имени. Мы пытаемся изменить строку, очистив ее. Теперь ссылки на действительные данные и их разыменование могут привести к неопределенному поведению, поэтому компилятор останавливает нас:

Прототипирование в Rust может быть сложными из-за его статически типизированной природы и из-за того, что Rust требует покрытия 100% условий. Крайние случаи должны быть описаны, даже если программист еще не знает, что там должно быть. На ранних стадиях разработки эти крайние случаи часто можно устранить, вызвав сбой программы, а затем можно добавить строгую обработку ошибок на более позднем этапе. Это другой рабочий процесс, он встречается в таких языках, как Ruby, где разработчики часто пробуют код в REPL, а затем переносят его в прототип, вообще не рассматривая случаи ошибок.

Rust все еще относительно новый язык, а это значит, что некоторые нужные библиотеки могут быть ещё недоступны. Положительным моментом является то, что есть много плодородной почвы для разработки этих необходимых библиотек, возможно, даже с использованием последних достижений в соответствующих областях компьютерных наук. Благодаря этому и возможностям Rust некоторые библиотеки Rust, такие как regex, являются лучшими в своем классе на любом языке.

Хотя Rust твердо привержен стабильности и обратной совместимости, это не означает, что язык доработан. Конкретная проблема может не решаться функциями языка, которые облегчили бы ее выражение или, возможно, даже позволили бы ее выразить. Например, в Rust асинхронные фьючерсы существуют уже более трех лет, но стабильная поддержка async/await появилась не так давно.

Компилятор Rust использует LLVM, это означает, что количество поддерживаемых платформ будет меньше, чем у C или C++.

А вам нравится Rust?

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации

Rust — это язык системного программирования, создатели которого уделили внимание трем вещам: параллелизму, скорости и безопасности. И хотя Rust считается молодым языком программирования — его первая стабильная версия вышла в 2015 году — он разрабатывается уже более десяти лет.

Сегодня мы бы хотели заглянуть в прошлое и рассказать историю языка Rust, показать, как изменились его функции и возможности за время разработки и привести конкретные примеры внедрения этого ЯП на практике.



/ изображение Jeff Vier CC

Личный проект (2006–2010)

Технология из прошлого, которая призвана спасти будущее от самого себя

— Грэйдон Хор (Graydon Hoare), разработчик Rust

Это одна из цитат Грэйдона Хора, которую озвучил Стив Клабник (Steve Klabnik) из команды разработчиков проекта Rust во время своей презентации на конференции ACM в 2016 году (слайды к презентации вы можете найти по ссылке, а для того, чтобы перемещаться между слайдами, используйте стрелки на клавиатуре). Эти слова хорошо отражают тот факт, что Rust — не революционный язык, имеющий передовые функции. Он просто включает в себя множество рабочих методов из «старых» языков (в том числе C++), повышая их безопасность.

Грэйдон Хор начал разработку Rust в 2006 году – в то время он был сотрудником Mozilla и занимался проектом в свободное от работы время. По словам Грэйдона, язык получил название в честь грибов семейства ржавчинные, поскольку те являются «распределёнными организмами», не имеющими «единой точки отказа», и обладают исключительной живучестью. Такие грибы имеют пять стадий жизненного цикла и быстро прорастают. Хор решил, что это хорошая аналогия для ЯП, сфокусированного на безопасности и скорости работы.

Занимаясь языком, Грэйдон установил определенные правила. Он отмечал, что в первую очередь необходимо уделять внимание семантике языка, а работа над синтаксисом — это последнее дело. Поэтому в ранней реализации Rust ключевые слова были не длиннее пяти символов — язык был «кратким» и использовал такие операторы, как log, ret и fn.

Например, первый код на Rust, который увидел свет, выглядел так:


Как отмечает Стив Клабник, со временем это ограничение было снято: часть ключевых слов «удлинили», например, ret превратился в return, а часть заменили совсем. Для сравнения, в современной реализации языка вывод строки «Привет, мир!» выглядит так:


Также за время эволюции часть концепций и ключевых слов языка была убрана. Когда над языком работал Грэйдон, Rust был объектно-ориентированным и использовал оператор obj для описания объектов. Сейчас как таковое ООП языком не поддерживается, но Rust дает возможность реализовать многие его понятия с помощью абстракций.

Rust также работал с функциями параметрического полиморфизма. Концепции обобщенного программирования в языке сохранились и сейчас (оформление кода вы можете найти в этом документе), однако десять лет назад для обозначения типа параметров использовались квадратные скобки:


Самостоятельно над Rust Грэйдон работал на протяжении четырех лет. За это время ему удалось воплотить в жизнь примерно 90% задуманных функций (часть из которых имела довольно грубую реализацию). Среда для выполнения кода была завершена на 70%. Всего за это время Хор написал 38 тыс. строк кода для компилятора на OCaml.

Переход к Mozilla (2010–2012)

Я не считаю, что у языка должны быть какие-то главные особенности.

Он должен состоять из набора понятных и надежных модулей, которые хорошо «работают» в комбинации друг с другом

— Грэйдон Хор (Graydon Hoare), разработчик Rust

По прошествии четырех лет, Грэйдон решил показать свой прототип менеджеру в Mozilla. В компании проявили интерес к проекту, поскольку искали инструмент для перестройки стека браузера на более простых технологиях, чем C++. Поэтому в компании создали команду (во главе с Грэйдоном) для работы над Rust, который стал основой браузерного движка Servo.

Тогда движок Mozilla не мог полноценно работать с мультиядерными системами, поскольку имел однопоточные схемы обработки контента. Например, однопоточными были функции формирования содержимого окна и запуска JavaScript. Rust позволил разделить код рендеринга на мини-задачи, выполняемые параллельно и экономящие ресурсы центрального процессора.

Кроме ускорения работы за счет распараллеливания операций, Rust позволил повысить защищенность браузера. На тот момент Firefox был реализован на C++ и содержал 4,5 млн строк кода. C++ — это «точный» язык программирования, требующий повышенного внимания к деталям, поэтому ошибки программистов могли приводить к возникновению серьезных уязвимостей. Задачей Rust стало снижение влияния человеческого фактора с помощью компилятора.

Годы typesystem (2012–2014)

Наша целевая аудитория — «разочарованные разработчики C++»

В этот момент Грэйдон отошел от работы над Rust и переключился на другие проекты. Как рассказывает Стив Клабник, после этого система управления стала более «распределенной». Была сформирована федеративная структура, в которой за изменения, вносимые в разные части проекта, отвечала отдельная группа разработчиков.

Команда продолжила расти, и в ней стали появляться люди, разбирающиеся в сложных системах типов. Поэтому началось активное развитие typesystem, и все больше аспектов языка выносились в библиотеки.

Например, на ранних этапах Rust был реализован «сборщик мусора» (GC — Garbage Collector), который Грэйдон внедрил для повышения защищенности памяти. Однако потом разработчики пришли к выводу, что они могут обеспечить тот же уровень надежности с помощью системы типов, и от GC отказались.

Это решение также сказалось на системе указателей, используемой в Rust. До удаления «сборщика мусора» в языке было три основных указателя:

  • Box (уникальный указатель)
  • & (заимствованный указатель, который назвали «ссылкой»)

Период с 2012 по 2014 год — это время, когда сообщество Rust начало обретать форму. В нем образовалось три больших «лагеря»: пользователи C++, пользователи скриптовых языков и функциональные программисты. Их экспертиза повлияла на язык — постепенно он стал сочетать в себе парадигмы функционального и процедурного программирования.

В марте 2014 года также был сформирован RFC-процесс, который использовался для представления значимых изменений в языке. Решение строилось по образу и подобию Python PEP, и сейчас в нем сделано 3 тыс. коммитов. Причем в RFC попадает любое изменение, даже вносимое разработчиками. По правилам команды Rust, никто не может вносить крупные изменения, не обсудив решение с сообществом.

Релиз (2015)

Мы не знаем наверняка, что из этого получится

В начале 2015 года была выпущена версия Rust 1.0 Alpha. В ней стабилизировали ядро языка, развили систему макросов, и, наконец, закрепили за целочисленными типами int и uint названия isize и usize. В начале второго квартала того же года Rust 1.0 перешел в бету — к этому моменту репозиторий crates.io имел 1700 крэйтов (структурная единица компиляции), а количество скачиваний из репозитория превысило один миллион.

В мае 2015 года состоялся официальный релиз — Rust 1.0. Это ознаменовало начало стабильности. С этого момента все вносимые изменения должны были иметь обратную совместимость, что позволило использовать Rust в реальных проектах. Он начал находить применение в таких сферах, как game dev, веб-разработка и разработка операционных систем.

Переход в продакшн (май 2016)

Если язык хорош лишь в чем-то одном, то это — провал

В 2015 году площадка StackOverflow провела опрос среди разработчиков, в котором их попросили отметить, с какими языками программирования они работали и с какими хотели бы познакомиться. Тогда Rust занял третью строчку рейтинга. Однако годом позднее он переместился на первое место — 79% пользователей изъявили желание продолжить работу с ним.

Один из резидентов Hacker News назвал главными достоинствами языка прозрачность и простоту документации. Другие пользователи также отмечали открытость и доброжелательность Rust-сообщества, которое всегда готово помочь с изучением особенностей ЯП.

При этом многие разработчики решают продолжить работу с этим языком из-за его механизмов безопасности. Как сказал один из пользователей Reddit: «Программирование на Rust — это как паркур со страховкой и в защите; иногда это выглядит странно, но вы можете делать многие трюки, не боясь сломать себе что-нибудь».

С момента релиза стабильной версии Rust начался период его полноценного использования в продакшн. Одной из первых компаний, которые применили Rust в своем проекте, стала Mozilla. Часть «внутренностей» Firefox 45 для Linux были переписаны на Rust, а начиная с версии Firefox 47, Rust-код присутствует и в версии для Windows. Их Project Quantum, анонсированный в октябре 2016 года, также имеет в своем составе компоненты Servo.

Rust используется и в Dropbox — на этом ЯП написано ядро их продукта. Компания Dropbox создала свое новое облачное хранилище Magic Pocket, в которое перенесла информацию с Amazon S3. Изначально оно было реализовано на языке Go, но при больших нагрузках проблемой становилось высокое потребление памяти и низкая предсказуемость поведения кода на Go. Для решения этих проблем был частично задействован Rust.

В прошлом году использовать Rust для обработки пакетов JavaScript начали в npm. Rust помог исключить задержки в системе, работающей с 350 миллионами пакетов в день. Специалист службы поддержки npm Эшли Уильямс (Ashley Williams) рассказывала об опыте использования Rust на конференции RustFest в Украине. Видео вы найдете по ссылке.

Rust также используем и мы в компании Bitfury. На этом языке программирования реализован наш фреймворк для создания блокчейнов Exonum. Впервые мы представили платформу на конференции RustFest 2017, где показали её возможности и провели воркшоп, на котором продемонстрировали работу сервиса по созданию криптовалют (краткое руководство о том, как создать криптовалюту на Exonum вы можете найти здесь).

Реализация на Rust оказалась кстати при работе со смарт-контрактами. Благодаря этому умные контракты Exonum имеют большую производительность, чем контракты Ethereum (или Fabric). Код платформы полностью открыт и лежит в репозитории проекта на GitHub.

Rust также находит применение в сфере информационной безопасности. Такие проекты как Tor уже переносят часть кода на Rust.

В целом, сегодня Rust в своих продуктах используют 105 компаний. Полный их список (в котором также отмечена и Bitfury Group) можно найти на странице Friends of Rust на официальном сайте. И количество компаний, создающих программные продукты на Rust, постоянно увеличивается, чему разработчики языка очень рады.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Физика:

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

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

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

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

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

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

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

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

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

Наша игра:

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

Сегодня мне хотелось бы рассказать вам историю одной замечательной многопользовательской игры в жанре Survival/Sandbox. Которая была придумана из-за спора двух друзей — геймеров, а в будущем коллег и основателей компании FacePunch. История игры, которую все в одно время хейтили, а в другое любили. Историю разработчиков, которые не опускали руки и шли к своей цели. Интересно? Ну тогда погнали)

Rust — это многопользовательская игра в жанре Survival/Sandbox. Разработка была запущена британской независимой студией FacepunchStudios в 2013 году.

Непосредственными авторами и создателями игры являются: Гарри Ньюман — основатель и владелец студии FacePunch, более известен по своему проекту Garry'sMod. И Маурино Берри — близкий друг Гарри.

Релиз состоялся в Steam: 11 декабря 2013 года.

Началось все с того, что в 2013 году разработчики проводили много времени играя в DayZ. Именно во время игры в неё Маурино сказал Гарри, что сможет сделать более лучшую «версию» этой игры. Гарри не стал возражать, после чего буквально за 6 месяцев они получили первый рабочий прототип игры. В большинстве своём игра была сделана кустарно, код писался на коленке, многие модели элементов (оружие, животные) были куплены в магазине Unityassetstore, а те модели что небыли куплены — сделаны на скорую руку. В то время игра буквально состояла из недочётов, багов и «дыр» как в геймплее, так и в коде, однако уже тогда игра имела свою любящую немногочисленную аудиторию.
Изначально игра открыто позиционировалась как клон DayZ, но постепенно она отдалялась от своего «корня» и в конечном итоге стала уникальным и самодостаточным проектом.

Ранний этап:

Пара слов о ранних порах игры:

Мало кто знает, но раньше металл плавили в кострах, отображение одежды на персонажах отсутствовало — даже без одежды персонаж выглядел как солдат в военной форме.

Оружия было мало и отображалось оно не корректно (вне зависимости от того, что вы держите — со стороны у вас всегда был либо пистолет, либо М4). О багах и эксплойтах тех времён можно писать бесконечно, дюпы, просмотр ящиков сквозь стены, проход сквозь текстуры и так далее.
А ещё там была машина, модель которой шла в комплекте с движком, она даже ездила (правда совсем недолго), позже её убрали, т.к. в плане геймплея она лишь мешала.

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

Релиз в Steam:

Релиз Rust в Steam состоялся 11 декабря 2013 года, до этого момента игра распространялась только через официальный сайт. Когда разработчики добавили игру в магазин Steam, они не рассчитывали на огромный прирост аудитории, ведь основной костяк уже давно играл и ничего сверхъестественного в игру добавлено не было. Но внезапно, на старте продаж в Steam, Rust буквально за 2 недели купили 150 000 человек, позже число покупателей увеличилось до 500 000.

А по прошествии 2-х месяцев было продано 1 миллион копий игры.
21 февраля 2014 года (через 2 месяца после релиза) Rust заработал своим создателям 40% от общей прибыли Garry'sMod за 9 лет продаж (примерно 20+ миллионов долларов), а продажи только продолжали расти. Без комментариев.
Это стало прецедентом, игра в состоянии EarlyAccess (ранний доступ), сделанная мягко говоря как попало, полностью обеспечивает себя и студию, гарантируя финансовую независимость себе и будущим проектам студии.
Кстати говоря, именно в феврале 2014 года Rust был на пике своей популярности, рекорд онлайна — 58 973 человека одновременно. Представляете масштаб происходящих тогда событий?
В январе 2014 года Rust стал самой продаваемой игрой на платформе Steam и держался на этой позиции довольно долго.
Все были в состоянии недоумения, «КАК ТАК?» Логично, люди пишут бизнес-планы, подключают спонсоров, набирают команды разработчиков по 20 человек, работают годами. А тут 2 парня за 7-8 месяцев сделав «это» получают результат, к которому многие идут десятилетиями (например сам Гарри Ньюман со своим Garry'smod).

Всё было грустно и весело одновременно, разработчики открыто заявляли — они не готовы к такому результату. Как говорил сам Гарри, план был таков: запускаем продажи, набираем 20-30 тыс. игроков и тихим сапом разрабатываем игру в течении нескольких лет, постепенно наращивая аудиторию (как и было с Garry'smod). Но тут случилось непредвиденное экономическое «чудо».
Каково это? Хорошо ли получить золотую медаль на старте марафона? На самом деле разработчики не сильно радовались, помимо прибыли они получили огромный груз ответственности и о планах «Медленно, но верно» можно было забыть, надо было срочно что-то думать и делать.

Чем же игра являлась тогда?

На момент релиза в Steam, в игре присутствовали: зомби (2 вида), оружие, взрывчатка, животные, радиация, 3 рэдтауна (малый, средний и большой), небольшие лутспавн-поинты (цистерны, ангар и т.д.), 2 типа строй.блоков (металл и дерево), эирдропы, статичная карта, смена времени суток (день 40 мин, ночь 20) и голосовой чат.
По сути ничего необычного, ИИ у NPC почти отсутствовал, соотношения баланса крайне сомнительны (построить что-то было намного легче, чем разрушить), огромное количество багов, эксплойтов и недочётов игровой механики и оптимизации. Тем не менее новоприбывшие в игру люди не могли не заметить атмосферности. По себе могу сказать, что в первое время игра казалась просто до жути интересной, подогревали интерес: атмосферность, кооперация, хардкор, войны, рейды, голосовой чат и самое главное — мысль о том, что это только начало разработки и всё самое «вкусное» ещё впереди.

После релиза разработчики активно начали переделывать косметическую составляющую игры: новое небо, трава, также были потуги добавить на карту реки и озёра.
Кроме того они пытались вносить изменения и в геймплей: револьвер, кровати, решётки на окна, «прочность предметов» и возможность их починки.
В конечном счёте разработчики начали строить планы по отходу от жанра «Зомби-выживание», первым шагом стало удаление из игры этих самых зомби и добавление вместо них «красных» волков и медведей, которые по факту были такими же зомби. Сделали это для того, что бы игру перестали сравнивать с другими играми с «зомби и пушками», ведь раст был не таким. Зомби в Rust, как таковые не играли никакой роли в геймплее, в отличии от других «подобных» игр. Сам Гарри писал, что «красные животные» лишь временная мера, «В будущем всё будет ребят» говорил он вкратце.

Даже запустил эпичный опрос с вариантами того, что игроки хотели бы видеть в качестве NPC. Чего там только не было, и роботы, и динозавры, и магические существа.

Казалось, что осталось совсем чуть-чуть и игра начнёт преображаться быстро и стремительно и ведь тогда всё только об этом и говорило…

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

1. Читы, создатели которых получили хороший стимул для работы. Фактически Rust для них стал золотой жилой, игра была не качественная, код был кривой, движок был уязвимый, защиты от читов окромя VAC не было совсем. Ну и тут понеслось. Видов читов было столько, что их даже все и не перечислишь, «за ваши деньги любой каприз» как говорится. Разработчики приняли бой и начали войну с читерами, которая почти сразу закончилась безоговорочной капитуляцией разработчиков.
Цитата Гарри Ньюмана:

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

2. Игра, точнее её код, который был очень плох. Попытавшись продолжить разработку на старом коде, разработчики поняли, что он ни на что не годен, по словам разработчиков, с таким кодом двигаться дальше было невозможно. Гарри не стеснялся в выражениях называя его говно-кодом. Исправляя баг — получали два, устраняя 1 эксплойт, всплывало ещё три, процесс разработки напоминал «сизифов труд», мало того что проблемы не уходили, так ещё и времени на работу уходило несоизмеримо больше, чем требовалось + никакого удовольствия от процесса, всё это так или иначе привело к «перезапуску», который нам с вами известен как текущая — стабильная версия игры.

После долгих мучений разработчиками было принято решение полностью перезапустить игру, и начать делать её с нуля. Основой для новой версии стала экспериментальная ветвь (Experimentalbranch), которая изначально предназначалась для «экспериментов» с игровой механикой.
Началось всё естественно с написания нового кода. Выглядело это примерно так:

И это ещё не самая первая версия, в самой первой вообще ничего не было кроме стартового кита с топором и квадратного острова.

В то время Legacy версия продолжала функционировать и многие даже понятия не имели, что разработку их любимого старого Rust'а остановили и приступили к созданию нового.
Будущее выглядело мутным, команда разработчиков не росла в числе, для наблюдателей всё двигалось медленно и казалось, что в ближайшие 3 года игру можно не ждать, с чего собственно и поднимались восстания в разделе отзывов Steam «верните деньги!».
Конечно подобные отзывы писали люди не просвещённые, перед тем как покупать игру с пометкой «Ранний доступ», надо знать, что игра может выходить в бету и релиз ещё очень долго (а в некоторых случаях не выйти вообще).
Во всём случившемся был один и единственный плюс — свобода действий разработчиков и огромное пространство для творчества, чем разработчики и воспользовались начав экспериментировать с геймплеем игры.
Для начала решили добавить вид от 3-го лица, как выяснилось «просто посмотреть» (позже его убрали), также решили сделать процедурно-сгенерированную карту — карта, которая будет генерироваться с помощью скриптов и алгоритмов, создавая на каждом сервере свою уникальную карту. Многие писали «Но ведь „машинная“ карта никогда не сможет стать лучше „ручной“, машина не сможет сделать действительно атмосферные пейзажи и создать поистине красивую карту» в чём-то они были правы, однако Андре показал, что правильно настроенная «машина» тоже немножко умеет в дизайн ландшафта. В конечном итоге разработчики всё-таки решили сделать образец карты вручную, но от процедурных карт не отказались. В финале разработчики обещали дать возможность любому серверу сделать свою собственную карту. Да и в принципе наладить работу Workshop'а со всеми вытекающими последствиями. Помимо этих нововведений, было добавлено ещё очень много всего, чем в Legacy и не пахло.

Во время работы над новой версией игры, разработчики изо дня в день подвергались травле со стороны сообщества, все твердили одно и тоже «Старый раст доделывайте! Нам там всё нравится, вот только пару багов исправьте и читеров уберите», объяснить им, что их просьбы были мягко говоря идиотскими было сложно, поэтому разработчики просто начали вести «Еженедельный блог разработки», в котором еженедельно отчитывались о проделанной работе. Самый первый был написан 28 марта 2014 года, в котором Гарри подробно описал, почему же ничего не обновляется в старой версии.

Из недели в неделю игра развивалась и результат работы есть, кто бы что не говорил.
Изучив Dev-блоги в хронологическом порядке — только глупец не заметит проектного роста и относительное ускорение разработки игры. Что уже говорить содержании блогов «тогда» и сейчас.

И вот, после не короткого рассказа мы можем сравнить две версии игры.
То какой раст мы видим сейчас, это долгий и насыщенный путь разработчиков, показывающий, что несмотря на хейт со стороны, своим желанием и упорством можно достичь небывалых высот. Но расслабляться разработчикам еще рано. К великому сожалению раст, как и любая другая популярная игра, имеет изъяны в виде читеров и макроссников.

Я надеюсь, что этот формат видео вам понравился и прошу вас оценить это видео лайком или дизлайком и конечно же перейти по ссылочки в описании на мой канал. Там много чего вкусненького и интересного.
Всем удачи и пока!)

Читайте также: