Bevy

Материал из Абсурдопедии
Перейти к навигацииПерейти к поиску

Bevy (Беви, рас. пинд. стая птиц, у отечественных красноглазиков — Бляви) — эпический опенсорсный движок для создания видеоигр на хипстерском языке программирования Rust, ставший главным объектом фапа для свидетелей секты памяти без сборщика мусора и ночным кошмаром для любого, кто просто хотел сделать простой платформер с шариком за пару вечеров. Позиционируется создателями как освежающе простой дата-дривен игровой движок, что в переводе на русский язык означает: у вас не будет визуального редактора, вы будете писать всё кодом в блокноте, компилятор будет унижать вас каждые 3 секунды за попытку передать ссылку, а каждые 3 месяца создатели будут выкатывать мажорный апдейт, ломающий к чертям 100% написанного вами кода.

Aquote1.png

Bevy — это когда ты 4 года ждёшь официальный визуальный редактор, а тебе вместо этого завозят спектральный пересчёт атмосферного рассеяния на Марсе и 42-й вариант синтаксиса списков сущностей в макросе.

Aquote2.png
— Анонимус с реддита

Суть[править]

Если отбросить восторженные визги растоманов, Bevy представляет собой гигантский полигон для обкатки концепции ECS (Entity Component System) в экстремальной форме. Пока презренные массы клепают клоны Vampire Survivors на Unity и Unreal Engine, обмазываясь гигабайтами визуальных редакторов и скриптами на C#, истинный беви-адепт постигает дзен:

  • Сущности (Entities) — тупо 64-битные циферки-идентификаторы. Никаких объектов в памяти, никаких виртуальных таблиц. Если ваш гоблин умер, это просто циферка 42 удалилась из таблицы.
  • Компоненты (Components) — чистые Си-подобные структуры данных без поведения. Позиция — это структура из 3 флоатов. Здоровье — это 1 инт. Мозги гоблина — пустая маркерная структура, потому что мозгов у него нет.
  • Системы (Systems) — обычные функции, которые перемалывают сущности пачками в многопоточном угаре, используя планировщик задач, который знает о вашем процессоре больше, чем вы сами.

Вся эта машинерия гордо именуется data-oriented design и преподносится как спасение человечества от рака объектно-ориентированного программирования. На практике это выливается в то, что даже для вывода надписи Press Start на экран вам потребуется зарегистрировать 3 плагина, настроить 2 системы, вызвать 1 макрос и помолиться духу Rust, чтобы borrow checker не решил, будто ваша текстура мутабельно заимствована соседней галактикой.

Откуда дровишки[править]

В далёком 2020 году разработчик Картер Андерсон (известный в этих ваших интернетах как @cart) внезапно осознал, что существующие движки на расте (вроде Amethyst) превратились в неповоротливое чудовище из трейтов, дженериков длиною в километр и времени компиляции, превышающего среднюю продолжительность жизни хомяка.

Сказав своё веское я сделаю свой движок с блэкджеком и спавном сущностей, Cart выкатил первую версию Bevy. Радости красноглазой общественности не было предела:

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

К 2024–2026 годам проект дорос до статуса благотворительного фонда 501(c)(3), собрал более 47500 звёзд на GitHub, перевалил за 6600000 скачиваний на crates.io и обзавёлся толпой контрибьюторов, пишущих код с такой скоростью, что авторы документации уже 6 лет пребывают в состоянии перманентной кататонии.

Анатомия монстра[править]

Жизнь типичного приложения на Bevy строится вокруг нескольких сакральных столпов.

ECS головного мозга[править]

В традиционных движках вы создаёте класс Monster, наследуете его от Actor, вешаете методы и живёте припеваючи. В Bevy за такую мысль вас предадут анафеме. Здесь вы обязаны декомпозировать всё на атомы:

// Создали маркер
#[derive(Component)]
struct Monster;

// Создали данные
#[derive(Component)]
struct Health(u32);

// Написали систему, которая ищет всех живых
fn kill_monsters(mut query: Query<(Entity, &mut Health), With<Monster>>) {
    for (entity, mut hp) in &mut query {
        hp.0 = hp.0.saturating_sub(10);
    }
}

Если вам вдруг понадобилось сделать так, чтобы при ударе по монстру воспроизводился звук, вы не можете просто вызвать метод play_sound(). Нет, батенька! Вы должны:

  • Сгенерировать событие (Event) или стриггерить Наблюдателя (Observer).
  • Записать его в очередь.
  • В следующем кадре отдельная аудиосистема вычитает событие и воспроизведёт сэмпл.
  • А если вам нужно передать монстру имя его обидчика — добро пожаловать в дебри связей сущностей (Entity Relationships), где компонент LikedBy ссылается на вектор других сущностей, а компилятор ласково напоминает, что циклические ссылки — это грех.

Breaking Changes[править]

Главная фича Bevy, от которой регулярно выгорают разработчики — это маниакальное стремление авторов сломать всё к чёртовой матери в каждом релизе. Релизы выходят строго по расписанию: примерно раз в 3 месяца. И каждый релиз сопровождается гайдом миграции размером с Войну и Мир.

Aquote1.png

Мы полностью переписали иерархии! Больше нет детей через Children-бандлы! Теперь у нас Relationships! А ещё мы выкинули PbrBundle, теперь пишите Mesh3d и MeshMaterial3d! А ещё мы удалили старый WGSL препроцессор, перепишите 500 шейдеров на WESL! Счастливого обновления!

Aquote2.png
— Патчноуты Bevy

Хроника страданий по версиям:

  • Версия 0.15: Внезапно выяснилось, что концепция Bundle (пачка компонентов для спавна) — это прошлый век и порождает тонны бойлерплейта. Бандлы объявляются устаревшими, вместо них завозят Required Components. Теперь компонент сам декларирует, что ему требуется: вешаешь Sprite, а к нему автоматически цепляются Transform и Visibility. Половина старых туториалов в интернете моментально превращается в бесполезную тыкву.
  • Версия 0.16: Завозят GPU-driven рендеринг, окклюжен куллинг и связи сущностей (Relationships). Теперь дети привязываются через компонент ChildOf, спавнить иерархии надо через макрос children![]. Авторы библиотек на crates.io массово уходят в запой, потому что 90% сторонних плагинов перестают собираться.
  • Версия 0.17: Полная переделка системы событий. Старые события теперь делятся на Messages (буферизированные) и Events (наблюдаемые через Observers). Вводится экспериментальный рейтрейсинг Solari. Трава в примерах колышется красиво, проекты смертных компилироваться отказываются.
  • Версия 0.18: Добавляют атмосферное рассеяние света, исправление шейдинга по Френелю (Френель больше не причинит вам боли, — гласит релиз), коллекции фич в Cargo (чтобы не компилировать весь движок ради 2D-текста) и систему безопасного одновременного мутабельного доступа к компонентам. Системы становятся ещё сложнее.
  • Версия 0.19: Презентован BSN (Bevy Scene Notation) — язык описания сцен прямо в коде. Внутренности 2D и 3D рендеринга перелопачены. Старые примеры снова сгнили.
  • Версия 0.20: Окончательный отказ от WGSL-диалекта в пользу WESL. В BSN меняют синтаксис: разделителем элементов в списках вместо запятых объявляется двойное тире -- (sic!). Рейтрейсер Solari получает поддержку DLSS-RR 4.5 на GPU от дядюшки Хуанга, а в планировщике появляется метод chain_weak() для параноиков, которым обычный .chain() казался слишком строгим.

BSN: Когда Rust захотел стать HTML[править]

К версии 0.19 разработчики движка осознали чудовищную правду: описывать сложные UI-интерфейсы и игровые сцены на чистом Rust — это адский труд, от которого опухают пальцы. Так родился BSN (Bevy Scene Notation).

Выглядит сие творение сумрачного гения следующим образом:

bsn! {
    Node { width: px(200), height: px(100) }
    on(|activate: On<Activate>| {
        info!("Кнопка нажата, шеф!")
    })
    Children [
        #OkButton
        @button("Подтвердить")
        --
        #CancelButton
        @button("Отмена")
    ]
}

Зацените разделитель -- между элементами! В версии 0.19 там были скобки и запятые, но Cart и команда решили, что скобки создают визуальный шум, поэтому в 0.20 ввели разделитель из 2 дефисов, на который компиляторный форматтер rustfmt смотрит с нескрываемым ужасом. Для защиты от автоформаттера разработчикам официально рекомендовали оборачивать списки в фигурные скобки bsn_list! {}, пообещав когда-нибудь в светлом будущем написать собственный BSN-форматтер.

Графика[править]

Рендерер Bevy — предмет особой гордости разработчиков и источник постоянных холиваров. Построенный поверх кроссплатформенной библиотеки wgpu, он умеет работать через Vulkan, Metal, DirectX 12 и даже WebGPU в браузере.

Внутри рендерера живёт настоящий зверь:

  • Retained Render World: Игровой мир и мир отрисовки разделены на 2 параллельные вселенные. Пока рендерер крутит кадр номер N на видеокарте, симуляция уже считает кадр N+1 на процессоре. Синхронизация между ними оптимизирована так, чтобы передавать только изменившиеся данные.
  • GPU-Driven пайплайн: Начиная с версии 0.16, процессор практически перестаёт раздавать команды на каждый чих. Видеокарта сама через Multi-Draw Indirect (MDI) отсекает невидимые полигоны, сортирует объекты и рисует сцены из сотен тысяч кубов и мешей за считанные миллисекунды.
  • Meshlets (Virtual Geometry): Местный доморощенный аналог Nanite из Unreal Engine 5. Позволяет засунуть в сцену 130000 детализированных драконов (суммарно под 115 миллиардов полигонов) и рендерить это на RTX 4070 со скоростью 3.5 миллисекунды на кадр.
  • Solari: Полноценный рейтрейсинг в реальном времени с поддержкой алгоритмов ReSTIR DI/GI, апскейлера DLSS 4.5 и процедурного освещения от солнца и атмосферы. Включается 1 флагом в Cargo. Правда, если у вас видеокарта не от Nvidia последних серий, ваш компьютер быстро превратится в портативный обогреватель с частотой кадров порядка 3 в секунду.
  • WESL (WebGPU Extended Shading Language): В версии 0.20 движок окончательно похоронил собственный препроцессор для шейдеров и перешёл на стандарт WESL. Теперь шейдеры поддерживают модули, нормальные импорты и условную компиляцию прямо из коробки, радуя авторов графики подсветкой синтаксиса в IDE.

Где редактор, Билли?[править]

Самый популярный вопрос в сообществе Bevy на протяжении всех 6 лет его существования: ГДЕ РЕДАКТОР СЦЕН?!

Ответ Cart'а на протяжении этих лет неизменен:

Aquote1.png

Официальный редактор — наш главный приоритет! Он выйдет в следующем году. Но сначала нам нужно переписать сцены, сделать UI-библиотеку, запилить протокол удалённой инспекции BRP, сделать Assets as Entities и стабилизировать BSN!

Aquote2.png
— Cart в каждом ежегодном отчёте

В то время как в Unity и Godot разработка начинается с перетаскивания ассетов мышкой во вьюпорте, в Bevy до сих пор исповедуется суровый текстовый хардкор. Позицию каждого кубика на уровне тру-разработчик прописывает циферками в коде: Transform::from_xyz(1.0, 2.5, -3.0).

Чтобы народ не бунтовал, команда разработала промежуточные костыли:

  1. bevy_remote (BRP): JSON-RPC протокол поверх HTTP/WebSockets. Позволяет подключиться к запущенной игре снаружи и спросить: Эй, покажи-ка мне компоненты сущности 1337!.
  2. Feathers: Официальный набор UI-виджетов со специфическим дизайном (выпадающие списки, слайдеры, древовидные структуры), на базе которых Cart клятвенно обещает собрать тот самый Редактор Мечты.
  3. Jackdaw и Renzora: Пока официальная команда полирует фундаментальные абстракции, отчаявшиеся комьюнити-девелоперы пилят свои неофициальные редакторы с блэкджеком и гизмо. Редактор Renzora, к примеру, разработали как надстройку над Bevy с собственным маркетплейсом ассетов, заставив сообщество яростно спорить, взлетит ли сторонний форк быстрее официального долгостроя.

Драма и холивары[править]

Там, где сталкиваются Rust и геймдев, градус неадеквата автоматически пробивает стратосферу.

Побег на Unity[править]

В 2024–2025 годах интернет взорвала статья инди-разработчика, который 1.5 года пилил коммерческую игру на Bevy, а затем плюнул и за пару месяцев переписал всё на Unity + C#, сократив кодовую базу в 4 раза.

Баттхерт в сообществе стоял эпический. Завязалась священная война:

  • Лагерь прагматиков: На расте невозможно писать геймплей! Чтобы бросить гранату, мне нужно написать сигнатуру функции из 15 параметров, запросить 8 взаимоисключающих Query, разрулить конфликты доступа и помолиться, чтобы не упал фреймрейт. На C# я просто пишу GetComponent() и игра готова!.
  • Лагерь растоманов: Вы просто не поняли ECS! Вы пытаетесь писать ООП на дата-ориентированном движке! Ваш C# утонет в мусоре от сборщика GC, а у нас параллелизм из коробки на 512 ядер процессора!.
  • Результат: Игра на Unity вышла и продаётся, а разработчики на Bevy продолжили переписывать системы движения под новый миграционный гайд версии 0.17.

Феномен Tiny Glade[править]

Главным контраргументом беви-сектантов долгое время служила ультра-успешная и уютная игра Tiny Glade, собравшая 96% положительных отзывов в Steam и кучу наград.

Aquote1.png

Смотрите, неверные! Tiny Glade написана на Rust и использует Bevy! Шах и мат, хейтеры!

Aquote2.png
— Типичный тред на r/rust

Правда, при детальном рассмотрении выяснился пикантный нюанс: создатели Tiny Glade действительно взяли из Bevy... ровно одну библиотеку — bevy_ecs. Весь графический пайплайн, процедурную генерацию, физику и кастомный рендерер на сыром Vulkan разработчики написали с нуля самостоятельно, потому что стандартный рендерер движка для их задач банально не подходил по производительности и гибкости. Но кого волнуют такие мелочи? В анналах истории игра навсегда осталась триумфом экосистемы.

Нейросетевое безумие[править]

В 2025–2026 годах мир накрыло волной генеративного кодинга. Появились толпы персонажей, гордо именующих себя vibe-coders. Они не знали ни строчки на Rust, но запускали Claude Code, Codex и прочие LLM, скармливая им промпты вроде: Сделай мне шутер на Bevy, чтобы там были скейтборды из Skate 3, физика блоков из Minecraft и пушки из Modern Warfare 2.

Благодаря тому, что у Bevy нет бинарных файлов проекта, мета-файлов и редактора, а всё выражается чистым кодом, нейросети поначалу генерировали удивительные франкенштейны (вроде нативного запуска MW2 под кодовым именем IW4L на iOS через SideStore). Но затем наступило похмелье:

  • Языковые модели обучались на старых версиях (0.8–0.12). Когда наивный промптер просил ИИ написать код для версии 0.19 или 0.20, модель уверенно выплёвывала мёртвые функции трёхлетней давности, приводя компилятор rustc в состояние праведного гнева.
  • Проект наводнили тонны сгенерированных PR-ов с псевдокодом, которые авторы даже не пытались компилировать.
  • Дошло до того, что в 2025 году руководство Bevy приняло драконовскую политику Strict No-AI Policy, полностью запретившую использование ИИ-кода в репозитории движка. Это породило охоту на ведьм: контрибьюторов подозревали в использовании нейросетей по малейшим признакам стиля, разработчики ссорились в Discord, а Картер Андерсон на 6-й день рождения движка грустно констатировал: Мы все эмоционально истощены и дико устали от этой войны. В итоге гайки пришлось слегка ослабить, заменив тотальный бан на сложные регламенты ревью.

Время компиляции[править]

Отдельный мем — скорость сборки. Хотя разработчики утверждают, что в режиме fast compiles (с динамической линковкой и альтернативными линкерами вроде mold или lld) инкрементальная сборка занимает от 0.8 до 3 секунд, первая чистая компиляция проекта с нуля (cold compile) способна заставить кулеры вашего ноутбука взвыть на ультразвуке.

Обычный диалог в чате новичков: — Пацаны, я написал cargo run, прошло 15 минут, у меня кончилась оперативка и зависла система. — А ты добавил в Cargo.toml оптимизации для dev-профиля? — Нет. — А линкер lld настроил? — Нет. — А dynamic linking включил? — Нет... — Ну так иди читай Quick Start Guide, щегол, тебе ещё 200 зависимостей пережевывать!

Игры и поделки на Bevy[править]

Вопреки всему, на движке реально выходят и функционируют проекты:

  • Tiny Glade — кавайный симулятор строительства замков, формально использующий ECS движка и спасший честь расто-геймдева.
  • Toroban — бесконечная головоломка с тороидальной топологией пространства в Steam.
  • Exofactory — амбициозный фабричный симулятор в открытом мире, автор которого выкинул 7364 строки спавн-кода после переезда на макрос bsn!.
  • Molecoole и Tunnet — ранние первопроходцы, доказавшие, что игра на расте может доехать до релиза в магазине Гейба Ньюэлла и не развалиться.
  • IW4L — безумная реинкарнация мультиплеера Call of Duty: Modern Warfare 2 (2009) на Bevy, загружающая оригинальные FastFile-архивы и транслирующая древние шейдеры Direct3D 9 Shader Model 3 прямиком в WGSL.
  • Сотни поделок с гейм-джемов — текстовые рогалики, симуляторы клеточных автоматов, вариации Flappy Bird и клоны Sokoban, авторы которых героически осваивали borrow checker ради 48 часов чистого фана.