После трех лет постоянной разработки игр на Rust вы действительно хотите отказаться от Rust?
После трех лет постоянной разработки игр на Rust вы действительно хотите отказаться от Rust?

Недавно статья «Уроки, извлеченные после трех лет постоянной разработки игр на Rust, и почему мы отказались от Rust» [1] взорвала сообщество.

иллюстрировать:Эта статья очень длинная,Но это стоит посмотреть. Данная статья не является дословным переводом оригинального текста.,но интерпретация,а также Мысли и выводы Сообществосерединаверно Эта статья из комментариев

Ни для кого не секрет, что Rust ненавидят так же сильно, как и любят.

существоватьонлайнсмотреть Прибыл два года назадиз Комментарий,Этот инцидент, кажется, подтверждает его заявление.,Будет ли он смеяться над собой из «Божьего пророчества» Шерстяная ткань?

Однако,Иди первымв заключение

Если вы внимательно прочитаете эту статью, вы обнаружите, что она на самом деле является заголовком. Им просто нужно хотеть обратиться за помощью, а не сдаваться. Rust, он просто отказался от использования Rust Разработка игр на Rust Игра Двигатель Его все равно следует поддерживать

Автор статьи указан Rust ограничения в области разработки игр, которые Rust Выбор языковой технологии имеет большое справочное значение.

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

кроме того,Нужно объяснить из-за чего,Объем разработки, обсуждаемой в этой статье: производится небольшой командой людей с относительно ограниченным бюджетом и графиком, является независимым и независимым.

Не отказываюсь от Rust, но прошу помощи

Автор этой статьи является одним из членов игровой команды LogLogGame. В команде всего два участника и технически она является независимым разработчиком.

они используют Rust Разработанный игровой движок darthdeus/comfy[2] . Честно говоря, если бы не эта статья, я бы и не узнал об этом двигателе. (Я приехал из 2018 С начала года наблюдаю почти каждый день. Rust Инструменты и приложения в различных экологических областях. Вчера я нажал на этот склад, а его даже не существовало. star Проходить)。Я Думаю, они действительно не хотят сдаваться Rust , но действительно столкнулся с трудностями и захотел обратиться за помощью。может быть, раньшеиз Сообщество Реклама не адекватна,Поэтому я хочу привлечь внимание Сообщество этой статьей. Я не пытаюсь разобраться в мотивах автора,В их статье также говорилось, что,Написать эту статью изглазизона,Также для сбора средств для поддержки их дальнейших исследований и разработок.。идти Comfy Загляните на склад, он по сей день обновляется.

фактически,Помимо названия статьи, в статье есть "Левинг Rust” Кроме того, во всей статье вообще нет упоминания о том, что он хочет отказаться. Rust。Он просто сказал, что ему это не понадобится в будущем. Rust После написания игры, возможно, игровой движок сохранится.

кроме того,В конце своей статьи о существовании они также рекламировали себя из игры.:「《Unrelaxing Quacks》[3]выжившийигра,Но это быстро. и похвалил: «Спасибо Rust позволяет ему успешно противостоять большому количеству врагов и снарядов, сохраняя при этом отличную производительность». Ведь именно на это они потратили больше года.

Мне очень любопытно, как они это переняли за последние три года? Rust Шерстяная ткань? Ответ дан в итоговой и рефлексивной части статьи, поэтому вкратце он таков:

  • Они провели год, используя godot-rust Реализовать первый товар на полках steam изнезависимыйигра BITGUN[4],
  • Затем они балуются использованием Rust Реализовать игровой движок Comfy и довел его до совершенства, на это ушло еще около года
  • Реализуйте новейшую игру《Не расслабляйтесь Шарлатанам» потребовался год. Можно представить, что процесс реализации этой игры должен был быть дополнительно усовершенствован. Comfy двигатель。потому что Comfy Он был с открытым исходным кодом всего восемь месяцев назад.

Comfy это использование Rust Весело строить 2D игровой движок, использующий wgpu и winit,Сделайте его кроссплатформенным,глазвпередподдерживать Windows、Linux、MacOS и ВАСМ. получать macroquad、Raylib、Love2D Вдохновленный многими другими движками, он разработан для хорошей работы и удовлетворения большинства распространенных случаев использования. но API Еще не стабильно,Могут произойти существенные изменения。если Вы хотитесуществоватьиграиспользуется в удобно, может потребоваться покопаться в исходном коде и, возможно, вручную настроить некоторые вещи

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

  • Независимая игровая команда LogLogGame должна реализовать себя в игре,иидтивыполнить Понятно Собственныйиз Игра Двигатель。Однако Им приходится полагаться на себяизиграчтобы поддержать себяиз НИОКР,На самом деле основное внимание уделяется существованию.
  • Bevy ,Ориентирован на игровой движок с открытым исходным кодом.,Пусть большинство независимых разработчиков перейдут на использование,жизнь складывается из обратной связи.

Я чувствую LogLogGame Слишком много работы, если они начинаются на основе godot-rust или bevy реализовать их игра,вместо того, чтобы сосредоточиться на себе Реализовать игровой движоквыше,Будет ли ситуация лучше? Это не обязательно так (причина указана далее в статье).,ноВозможно, это может дать нам некоторое вдохновение. Возможно, лучше найти направление нашей собственной концентрации.

Возможно автор тоже знает об этой проблеме. Он в статье заявил, что больше не будет использовать. Rust развиватьигра,После выхода ноновыйигры,все равно сделаю это Comfy Двигатель Работа по миграции рендерера(еслия правильно понялизразговаривать)。

автор Оригиналразговаривать:I do however plan to resume working on this after the release, and considering basic things already work there, I'm hopeful the port shouldn't end up being too complicated.

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

Уроки, извлеченные из разработки игр на Rust

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

«Как только вы освоите Rust, все эти проблемы исчезнут»

Автор упомянул проблему, с которой он столкнулся в сообществе, то есть когда он столкнулся с различными проблемами, Rust Сообщество Многие скажут: «Как только вы освоите Rust, все эти проблемы исчезнут»。

Автор отметил: «Это предложение кажется Rust В сообществе появляется подавляющая сила, когда кто-то упоминает, что он в Rust языкиз Когда сталкиваешься с проблемами на базовом уровне,Ответ:“Ты просто пока этого не понимаешь, обещаю, как только ты научишься, все станет ясно.”。Это не простосуществовать Rust поэтому, если вы попытаетесь использовать ECS,ты получишь то же самоеизотвечать。еслиты попробуйиспользовать Bevy,Вы также получите то же самоеизотвечать。еслиты попробуйиспользоватьлюбой каркас, который можно сделать GUI(Будь то адаптивное решение или немедленный режим),Вы получите тот же ответ».

Смысл этого предложения таков: «Вы столкнулись с такой проблемой, потому что плохо учитесь». В других языковых сообществах это может показаться невежливым. Но в сообществе Rust для этого есть причина.

потому что Проверка типа компилятора Rust, проверка заимствования прав собственности и другие механизмы.,Заставит разработчиков существовать при возникновении таких проблем,Поразмышлять над собственной структурой кода。Rust в отличие от другихонязык Что Праджняразвивать ВОЗделай все, что хочешь,это ограничение。такразвивать ВОЗВы можете часто сталкиватьсяприезжать「Принудительный рефакторинг компилятора」извремя。

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

новерно для маленькой игры,Особенности,“Выбросьте код после его написания“,потому что в будущем можно будет написать лучше,Он не будет сохраняться в течение длительного времени. Если функция соответствует требованиям, все будет в порядке.,Пока игроки могут в нее играть,Неважно, если качество кода плохое。так,Rust Принудительный рефакторинг компилятораиз особенность, существует Этот сценарий очень неудобен для настоящих разработчиков. потому что Что Вы четко знаете, что «Натуосян» потом ни к чему, но вам все равно придется его реконструировать.

так,На самом деле это вопрос технического отбора., скорее, чем Вопрос о языковой войне

“Rust Отличная производительность при крупномасштабном рефакторинге, решение большинства задач проверки заимствований. self вызванные проблемы»

Итак, подводя итог, Одним из самых больших преимуществ Rust является то, что его легко рефакторить.。Это признается всемииз Преимущества。

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

Приложение игра очень разное. Цитата пользователя сети,“Игра Двигатель Требуется управление чрезвычайно большими количествамиизсостояниеисостояниеизменять(этотдануждаться,это не дизайн)”。

Автор также сказал: «Игры, как сложные конечные автоматы, имеют фундаментальную проблему, и их требования часто меняются. Rust Подготовлено в CLI илисервер API иписатьнезависимыйиграсовершенно другой。гипотезаглазотметкада Создано для игроковхорошийизопыт,вместо комплекта инертной универсальной системы,Спрос может меняться каждый день после того, как люди начнут играть в игры,Вы поймете, что некоторые вещи должны бытьотфундаментально изменить。Статические и перепроверенные функции Rust напрямую конкурируют с этим.”。

Много раз мы используем Rust Если при написании кода приложения мы сталкиваемся с проблемой проверки заимствования, это означает, что в нашем коде существует риск «висячих указателей». В настоящее время реконструкция и ремонт действительно необходимы. Это Rust гарантия безопасности.

Однако,Автор говорит,Он то есть "не хочет добра от кода",Он просто хочет "быстрее игра",«Проверяйте другие идеи быстрее». но Компилятор заимствует проверки, чтобы заставить его выполнить рефакторинг своего кода. Автор считает,верно с точки зрения независимой игры,Ремонтопригодность не является корректной ценностью。потому Независимые разработчики игр должны стремиться к скорости игры. В то время как другие языки программирования позволяют решать подобные проблемы проще, не жертвуя качеством кода.

Я согласен с его точкой зрения,нонезависимыйигра Также разделены на типы Бар.если Это такой блокчейн?игра Шерстяная Действительно ли качество кода имеет значение в сценариях, связанных с финансовыми интересами?

«Косвенность решает только некоторые проблемы, и всегда за счет комфорта разработчика»

Автор говорит, что Руст Очень нравится и часто работаетиз Базовое решениеДобавьте слой косвенности

Я не думаю, что это следует считать Rust Уникальный? Разве нет известной поговорки о компьютерах? :“Любую проблему в информатике можно решить косвенным путем.”。

Rust Многие проблемы с проверкой заимствований можно решить, просто сделав что-то косвенно. Например, через Copy/Moveнекоторый контент,илипрохождение сохраняет его в командном буфере.,Затем выполните его позже.

Автор приводит два примера, иллюстрирующих, что в Rust реализованы некоторые интересные шаблоны проектирования для решения таких проблем:

  • World::reserve in `hecs`[5],hecs библиотекаиз reserve_entities и reserve_entity Функция позволяет Можетсуществовать ECS (Entity Component System) Предварительно выделенные объекты в рамках ID, этот дизайн может хорошо работать и Rust из жизненного цикла и модели параллелизма. Зарезервирована только сущность ID, сущность создается не сразу. Это означает, что эти сущности существуют в резервной фазе и не будут участвовать ни в каком запросе или мировой итерации, пока они не реализуют такую ​​фазу. insert или despawn и т. д. операции явно преобразуются в «реальные» объекты. Этот шаблон ленивой инициализации помогает уменьшить конфликты жизненного цикла, потому что что это обеспечивает большую гибкость контроля, когда данные (например, компоненты) и объекты ID ассоциация.
  • get2_mut in `thunderdome`[6] , вы можете получить сразу два изменяемых заимствования из одной коллекции. Это существует Rust Основными правилами являются нарушения правил и операций заимствования.,ноэтотиндивидуальный Библиотекаиспользоватьдизайн Умный шаблонвыполнить Понятно。Thunderdome Дизайн библиотеки вдохновлен generational-arenaslotmap и slab библиотека, которая представляет собой Реализация структуры данных Arena (Арены). Вы можете понять это как Arean Это своего рода «ГК» от реализации.

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

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

игра Что особенногосуществовать Потому что мы часто заботимся друг о другеизсобытие、идентификацияизмомент времени,а также в целом управляет большим количеством штатов одновременно. Передача данныхсуществовать между границами событий означает, что логика кода внезапно разделяется на две части, и хотя бизнес-логика может быть «одним блоком», существование когнитивно должно рассматриваться как две части. Каждый, кто пробыл в существовании Сообщество достаточно долгое время, имел такой опыт и ему говорили, что это на самом деле хорошо, сосредоточьтесь на разделение точек, код более «чистый» и так далее. Видишь ли, Раст Дизайн очень умный, если что-то нельзя сделать, то это потому, что Что-то не так с дизайном, я просто хочу заставить вас идти по правильному пути... верно?существовать C# Только нужно 3 Строка кода имеет значение, в Rust внезапно рассыпался в двух местах 30 строки кода. Самый типичный пример примерно такой: «Когда я перебираю этот запрос, я хочу проверить компонент на другом объекте и запустить ряд связанных систем» (генерировать частицы, воспроизводить звук и т. д.). Мне говорили люди: ну, это, очевидно, Event , вам не следует писать этот код в одну строку. Если вы думаете, что «но он не будет расширяться», или «он может существовать, рухнув позади», или «вы не можете предполагать, что глобальный мир, потому что что XYZ" или "Что если это многопользовательская игра" или "Это просто плохо из-за кода"... Я понимаю, что вы имеете в виду. носуществовать Вы объяснили мне, что я был неправ, когда закончил Я реализую свою функцию «из» и иду дальше. Я пишу код один раз, не думая о самом коде, и когда я пишу код, я постоянно думаю, что постоянно реализую функцию «игра». Кроме того, это действительно игрок из-за влияния. Я не думал о том, «как правильно получить здесь генератор случайных чисел», или «могу ли я предположить, что это однопоточный из» или «нет существования, что произойдет, если мои прототипы перекрываются во вложенных запросах», и после этого я также получаю никаких ошибок компилятора и сбоев средства проверки заимствований во время выполнения. Я существую тупо и без языка и тупо и без двигателя и с поль зуется в и писать существующий код, думая только о самой игре на протяжении всего процесса.

То, что хочет выразить автор, на самом деле очень просто.,то есть Rust Ограничил свое существование игры, развитие свободной игры, потому что что ему не нужно качество кода (при условии, что использовать Rust)。если Замените его наонязык,СравниватьнравитьсяC/Cpp/ Go/Java / Python /Ruby Подождите, пока он не перестанет беспокоиться о подобных проблемах, потому что что Он может делать все, что хочет.

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

расширенное обучение

hecs Резервные организации в ID из Механизм аналогиченверно Режим «Слоновий пул»;reserve_entities и reserve_entity Функции предоставляют механизм создания сущностей. ID, это можно считать шаблоном фабрики с задержкой;

Thunderdome библиотека Index Структура:

Язык кода:javascript
копировать
/// Index type for [`Arena`] that has a generation attached to it.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct Index {
    pub(crate) slot: u32,
    pub(crate) generation: Generation,
}

slot (слот) используется для индексации внутреннего массива, а generation (Генерация) Используется для проверки действительности ссылки. При удалении элемента его slot Может повторно использоваться новыми элементами, но новые элементы будут иметь увеличенный generationЧисло,Это предотвращает случайное обращение старых ссылок к новым.

Язык кода:javascript
копировать
pub fn get2_mut(&mut self, index1: Index, index2: Index) -> (Option<&mut T>, Option<&mut T>) {
    // Сначала проверьте, одинаковы ли два индекса, и выдайте, одинаковы ли они. panic,потому что Вы не можете получить две изменяемые ссылки на один и тот же ресурс
    if index1 == index2 {
        panic!("Arena::get2_mut is called with two identical indices");
    }

    // Обработка ситуации, когда индекс указывает на один и тот же слот, но принадлежит разным поколениям.
    if index1.slot == index2.slot {
        // Ограничение средства проверки заимствований заставляет нас дважды обращаться к хранилищу, чтобы получить правильное возвращаемое значение.
        // Если первый индекс действителен, возвращает первый элемент из изменяемой ссылки и None
        if self.get(index1).is_some() {
            return (self.get_mut(index1), None);
        } else {
            // Если первый индекс недействителен, верните None Второй элемент из изменяемой ссылки
            return (None, self.get_mut(index2));
        }
    }

    // Если индексы указывают на разные слоты, хранилище можно безопасно разделить, чтобы получить две независимые изменяемые ссылки.
    let (entry1, entry2) = if index1.slot > index2.slot {
        // если index1 из слота больше, чем index2, затем сначала разделите эту часть, чтобы гарантировать, что каждая часть заимствована независимо.
        let (slice1, slice2) = self.storage.split_at_mut(index1.slot as usize);
        (slice2.get_mut(0), slice1.get_mut(index2.slot as usize))
    } else {
        // если index2 из слота больше, чем index1, затем сначала разделите эту часть
        let (slice1, slice2) = self.storage.split_at_mut(index2.slot as usize);
        (slice1.get_mut(index1.slot as usize), slice2.get_mut(0))
    };

    // использовать индекс номера поколения, чтобы получить действительное значение каждого слота
    // Ссылка считается валидной только в том случае, если номер поколения в индексе и соответствующий слот в хранилище совпадают.
    (
        entry1.and_then(|e| e.get_value_mut(index1.generation)),
        entry2.and_then(|e| e.get_value_mut(index2.generation)),
    )
}

Основными этапами этого метода являются:

  • Проверьте, совпадают ли индексы
  • Относитесь к тому же slot но другой generation изиндекс
  • Разделение хранилища для защиты ссылок
  • проходить generation Объект проверки номера на действительность

Шаблоны проектирования в этом подходе в основном следующие:

  • безопасная сегментация:проходить split_at_mut Надежно разделите пространство хранения, обеспечив независимый доступ к обеим частям одновременно.
  • Условная проверка:проходитьпроверятьиндексиз generation номер для обеспечения действительности и последовательности данных.

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

«ECS решает неправильный тип проблем»

Автор говорит,потому что Rust из Тип системы Borrow Checker из Как это работает, ECS Стало «как сделать так, чтобы вещи ссылались на другие вещи» из проблемы и из естественного решения.

Но на самом деле ЭКС Архитектура не Rust Оригинальный. существовали раньше много лет назад,В «Overwatch» от Blizzard используется ECS Архитектура[7]только Rust из typesystemai Ruby Checker особенно подходит для реализации такого рода архитектуры.,таксуществовать Rust Более популярен в экологии ECS архитектура.

ECS (Entity Component System) — это архитектурный шаблон, обычно используемый при разработке высокопроизводительных вычислительных приложений. Он отделяет компоненты от сущностей, делая обработку более эффективной и гибкой.

существовать Традицияиз Длявернослонпрограммированиесередина,верно На объекты часто ссылаются, а указатели связаны друг с другом,Это приводит к сложным проблемам управления жизненным циклом и потенциальным рискам безопасности памяти. ECS Эти вопросы упрощаются за счет:

  1. Хранение компонентов:существовать ECS компоненты хранятся независимо и обычно не ссылаются напрямую на другие компоненты. Вместо этого они могут содержать идентификаторы, указывающие на другие сущности или компоненты (например, сущность ИДЕНТИФИКАТОР). Этот метод позволяет избежать прямых ссылок и улучшает управление жизненным циклом. добавление и удаление компонентов обрабатываются независимо.
  2. Сущность и компонент из развязки:сущностьсуществовать ECS серединав целомкакодинлегкийсортиз Хранение идентификаторовсуществовать,этосам не держитсяданные。всеизданные Всепроходитькомпоненты, представляющиеиз,Эти компоненты эффективно сохраняются и обрабатываются менеджером компонентов. Такое разделение гарантирует, что по завершении жизненного цикла объекта,Все его компоненты можно легко очистить.,Нет необходимости беспокоиться о сложной проблеме очистки изображений в традиционном понимании.
  3. системаработает независимо:каждыйсистема Всенезависимыйдействоватьгруппаидентификацияизкомпоненты,Такая конструкция снижает потребность в совместном использовании,Уменьшает сложность и возможность ошибок. Связь между системами обычно осуществляется путем совместного использования ресурсов или событий прохождения.,этотнекоторыймеханизм Все Можетсуществовать Rust Эффективная реализация в рамках модели безопасности.

Автор тоже согласен ECS Преимущества архитектуры. Его точка зрения заключается в том, что, по его мнению, сообщество ставит ECS злоупотребляли

Автор выделяет три проблемы:

  • Имеет действительный указатель из данных типа указателя. Вопрос простой,еслихарактер A следовать за персонажем Б, в то время как B удаляется (и освобождается), то указатель будет недействителен.
  • Rc<RefCell<T>> В сочетании со слабыми указателями. Хотя это может сработать, но производительность важна в существовании игры, потому что Из-за локальности памяти эти накладные расходы очень велики.
  • верноEntity массив для индексации. существуют первый случай,Мы получим неверный указатель,И существуют в этом случае,еслияу нас естьодининдекси удалитьодинэлемент,Индекс может все еще быть действительным,Но указывает на другое.

Для этих вопросов автор использует ранее упомянутую Thunderdome Библиотека решила эту проблему, и он настоятельно рекомендовал эту библиотеку.

Но он считает, что большинство людей в обществе думают ECS Выгода на самом деле generational arena (Грозовой) преимущества. Когда люди говорят «ECS дает мне хорошую локальность памяти", но они запрашивают только что-то вроде Query<Mob, Transform, Health, Weapon> При перемещении объектов то, что они на самом деле делают, по сути, эквивалентно Arena<Mob>

Язык кода:javascript
копировать
struct Mob {
  typ: MobType,
  transform: Transform,
  health: Health,
  weapon: Weapon
}

Поэтому автор считает, что иногда отличиться нужно и может понадобиться только одно. generational arena , скорее, чем ECS . Много раз люди используют ECS дапотому что он решает конкретную проблему: «куда мне следует поставить моего изверно существующего слона», вместо того, чтобы действительно использовать его для своей производительности, он на самом деле не нужен. В этом нет ничего плохого, просто когда эти люди спорят с другими людьми в Интернете, пытаясь убедить других, что то, как они поступают, неправильно и что им следует это делать по причинам, указанным выше. ECS Проблемы возникают тогда, когда им это вообще не нужно.

В статье обсуждается несколько различных взглядов на ECS.

  1. ECS как инструмент динамической композиции

ECS Позволяет разработчикам динамически объединять различные компоненты (юниты) в сущности (элементы). Этот метод очень гибок и позволяет добавлять, удалять и изменять компоненты во время выполнения в соответствии с логическими потребностями. Например, игровой персонаж (сущность) может иметь позицию (Transform компонент), состояние здоровья (Health компоненты), а также вооружение и техника (Оружие компоненты). Эта динамическая комбинация позволяет разработчикам создавать сложную и разнообразную логику, сохраняя при этом модульность кода и удобство сопровождения.

  1. ECS как инструмент оптимизации производительности

существовать ECS , компоненты обычно хранятся по типу в компактных массивах. Этот метод хранения называется. «Структурированный массив» (иногда заимствованная терминология данных как «массив данных», ориентированный на данные Дизайн). Это может значительно улучшить локальность памяти, потому что какое связанное изданное хранилище существует в памяти, расположенной ближе к процессору существоватьдоступэтотнекоторыйданные Кэш можно использовать более эффективно, если。примернравиться,еслисистема Нужно обработатьвсесущностьизздоровыйсостояние,это Может连续地доступжитьмагазинвсездоровыйкомпонентыизмножество,вместо этого перейдите к значку разбросанного хранилища, чтобы найти данные о состоянии здоровья. Этот метод особенно подходит для сценариев, требующих частой обработки больших объемов информации.,Например, физическое моделирование или сложная игра AI-защита.

  1. ECS упрощает Rust Borrower Checker из приложения

ECS Еще одним важным преимуществом является то, что он упрощает Rust Управление контролерами займов. Ржавчина Средство проверки заимствований обеспечивает безопасность памяти и правильность доступа, но в традиционных объектно-ориентированных библиотеках управление сложными отношениями жизненного цикла может стать очень трудным. использовать ECS, разработчики могут реализовать отдельное поведение данных и упростить соблюдение требований. Rust из заимствованных правил, от и упрощать разработанные. Сущность существует ECS серединав целомдалегкийсортизидентификатор,Компонентная исистема независима от,Это позволяет осуществлять трансграничный доступ без нарушения правил заимствования.

  1. ECS Создано как динамически generational arenas

существовать ECS В архитектуре сущность обычно состоит из набора компонентов, каждый из которых может хранить существующую generational arena середина. Эта структура позволяет очень эффективно добавлять, удалять и изменять компоненты, обеспечивая при этом достоверность и безопасность ссылок. Создавайте динамически generational arenas Относится к системе, в которой динамически управляются не только данные, но и контейнер данных (т. арены) сами по себе также могут быть динамически созданы и настроены по мере необходимости.

  1. ECS то есть Bevy

Отчасти это шутка со стороны автора. потому что что Bevy существовать Rust Сообщество ECS представители и Bevy и ECS Привязка глубокая и включает в себя UI Используйте оба Беви. Но автор также указывает на то, что хотя он и может существовать во многих вещах несогласен, но трудно отрицать, что Bevy верно ECS API и ECS Собственные эргономические улучшения.

Кроме того, автор также упомянул Unity DOTS,этоприроданачальстводаихиз“ECS”(а также другие ориентированные данныеиз вещей). Автор считаетсуществовать Unity Вы не найдете ни одного человека в этой области, который бы подумал DOTS это плохая функция, которую не следует сохранять, но я не думаю, что кто-то так думает; DOTS то есть будущее из всего, играверно, как следует из сохранения существования быть стертым, все из Unity должен быть переведен в DOTS。

те, кто использовал Godot Можно увидеть аналогичную точку зрения. Особенно те, кто использует gdnative (например, через godot-rust )излюди,Хотя дерево узлов, возможно, не является лучшей структурой данных для всех ситуаций.,новернодля многих вещей,это Они действительно очень удобны.

но Rust В обществе автор считает, что Bevy из “ECS everything” Концепция, приносящая неудобства разработчикам. Очевидным примером также является Автор считает Bevy Главной точкой отказа является Bevy из UI система,Это уже давно больной вопрос,Особенно сочетание обещаний типа «Мы обязательно начнем разработку редактора в этом году!»

ECS существовать Rust Сообществоосуществовать, рассматриваемое как инструмент в других языках, стало почти «религиозной верой»: его следует использовать, потому что что это чисто и правильно, потому что Это правильный способ сделать это. Rust Часто создается впечатление, что подростки обсуждают свои предпочтения практически во всем. Они выражают часто очень сильные мнения, а не много нюансов. программирование – очень деликатная деятельность, и людям часто приходится составлять неоптимальную выборку. Также Получайте результаты вовремя. существовать Rust Перфекционизм иверно «правильный путь» из-за одержимости системой экологии часто заставляет меня думать, что этот язык привлекает более новых и впечатлительных людей.

на самом делесуществовать Rust Сообщество ECS Не только для реализации игры, например, существующей системы визуализации. rerun[8] Также применяется в ECS архитектура.

Поэтому не ставьте ECS как панацея

«Общие системы не приводят к интересному игровому процессу»

Автор перечисляет некоторые факторы, которые могут создать хорошие мысли:

  • Большинство Процесс уровня должен быть разработан вручную. Это не значит «линейный» и «сюжетный».,ноозначает“верноигрок, когдасмотреть Существует большой контроль над тем, что”。
  • существуют Тщательно продуманные и персонализированные взаимодействия на каждом уровне.
  • VFX Нетдабаза Виметьмного Взаимнотакой жеизчастица,Скорее, события синхронизации времени (например.,Несколько различных пусковых установок ведут огонь по заранее разработанному графику), и все они работают в существующей системе.
  • Провести несколько итераций игры, тестирование геймплея, эксперименты и отбрасывание контента, который не работает.
  • Выпустите игру для игроков как можно скорее,так чтоверноэто для тестированияи Итерировать。еслибезлюдисмотретьк этому,когда он выйдет,Никого это не волнует, тем больше шансов.
  • Уникальный и незабываемый опыт.

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

Вот хороший пример игры - "The Binding of Isaac".,Это очень простая игра-рогалик.,Содержит сотни обновлений, которые можно модифицировать сложными, интерактивными и всесторонними способами. Это место со множеством систем взаимодействия в игре.,Но это также совсем не универсально. Это не игра с 500 "+15% урона" из апгрейдов игры,Вместо этого многие улучшения заключаются в следующем: «бомбы прилипают к врагам», «вы стреляете лазером вместо боеприпасов» или «первый враг, которого вы убиваете на уровне, больше не появляется».

Ты не будешь проводитьсуществовать, сидя в подвале целый год,Подумайте обо всех крайних случаях и создайте общую систему.,Затем PCG сделает все улучшения, чтобы игра получилась хорошей. Вам предлагается построить какой-то простой механизм из прототипа и позволить людям играть в него.,Проверьте, действителен ли основной контент,Затем добавьте еще что-нибудь, чтобы люди снова захотели играть. Некоторые из этих взаимодействий можно обнаружить только после многочасовой игры в игру и опробования множества разных вещей.

Автор «Падения трона» Jonas Tyroller существоватьон оигра Дизайниз Видео[9]середина Оченьхорошийобъяснять Понятноэтотнемного:“хорошийизигра Нетдасуществоватьлабораториясередина Осторожнодизайниз,Скорее, она создана опытным игроком и разработчиком, хорошо разбирающимся в этом жанре.,Он понимает каждый аспект дизайна,И прежде чем прийти к окончательному проекту, было предпринято множество неудачных попыток. Хорошая игра – это отказ от многих плохих идей.,проводить нелинейный процесс изготовления».

1людиразвивать、SteamХорошие отзывы97%,Эта «суперупрощать» RTS Tower Defense выиграла дом! «Thronefall» издается GrizzlyGames как независимая игра.,Поскольку версия раннего доступа была запущена в Steam 2 августа 2023 г.,игра Самое большое количество людей онлайн достигло 6723.,В последнее время количество людей в сети остается выше 3000. С момента выпуска игра получила более 8000 отзывов игроков.,До 97% из них — положительные отзывы.,Этого достаточно, чтобы показать, что игроки «Thronefall» высоко ценят это.

Более гибкий язык позволит разработчикам сразу реализовывать новые функции в грубой форме.,Тогда поиграй в игру,Проверьте это и посмотрите, действительно ли эта функция интересна.,Возможно, проделаю эти итерации в короткие сроки. И когда разработчики Rust закончат рефакторинг,C++/C#/Java/JavaScriptразвивать ВОЗужевыполнить Понятно Может多Неттакой жеизигра Особенности игры,Много играл и пробовал все эти функции,верно Они лучше понимают, в каком направлении им следует развиваться.

«Создание веселых и интересных игр — это быстрое прототипирование и итерация, а у Rust совершенно другие ценности»

Автор считает, что Руст Сообщество приняло это верно Rust Соответствующие вещи, безжалостный позитив, похвала и понятия полностью изолируют себя от внешнего мира. Реальный мир не такой дружелюбный. Пар Игрокам в Интернете все равно, используется ли что-то Rust Их не волнует, сколько времени ушло на это, и их не волнует, является ли код открытым исходным кодом. Что их волнует, так это наблюдение и возможность в течение нескольких секунд определить, является ли это пустой тратой времени или чем-то потенциально интересным. Игроки не заботятся о разработчиках, они просто существуют на несколько секунд, чтобы убедиться, что игра правильная и желательная, но, по крайней мере, это позволяет нам быть честными. Это заставляет игру концентрироваться только сама наигра,и Нетсосредоточиться на что-нибудь еще, потому что что В конце концов, опыт игры – это самое главное.

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

Качество кода – это фактор, обеспечивающий удобство работы пользователей.,Если вы не слишком гонитесь за качеством кода

Автор видимо понимает,Он сказал, что, конечно, согласен с этой точкой зрения.,игра вылетает, когда кто-то нажимает кнопку воспроизведения,или Когда вы повредили файл сохранения и игрок потерял прогресс,Это определенно повлияет на опыт игрока.

Но он думаетвсеэтотнекоторый Все完全忽略Понятноверноважно для игроковизиметь значение。есть много случаев,Прогресс людей очищен,Но они все равно вернутся к этому и сыграют еще раз.,потому чтоигра так хороша。как игрок,Он делал это не раз.

впереднести得да «Хорошая игра», правда?

Смысл автора очень ясен: мы должны сосредоточиться на хорошей игре, скорее, чем Хороший код。потому что Rust из Принудительный рефакторинг, заставляющий его тратить силы на достижение «хорошего кода», скорее,чем「хорошийигра」начальство。

«Процедурные макросы не являются отражением»

В Rust нет такой возможности «языка сценариев». Это стало особенно болезненно, особенно с точки зрения редактирования уровней, инструментов и отладки.

на самом деле,C/Cpp Нет, так объедините lua Более распространены скриптовые языки, такие как Сравнивать. Я всегда думал, что Сообщество может понадобиться курс. Rust Синтаксис тот же и Rust Интерактив на языке сценариев.

Rust В . есть процедурные макросы. но Автор Считается, что процедурные макросы в основном позволяют программистам запускать код после компиляции, потребляя Rust из AST,и генерировать новые коды. К сожалению, это,С этим методом связано много проблем.

первый,Процедурные макросы на самом деле не кэшируются.,Вместо этого существуют повторы при перекомпиляции. Это приводит к тому, что ваш код приходится разбивать на несколько ящиков.,Это не всегда возможно из-за,ииеслитыбольше зависит от Проходить Ченг Хун,Время компиляции значительно увеличится. Есть много удобных процедурных макросов.,Сравниватьнравиться profiling из function Макрос, очень полезный, но в конечном итоге его не использовать, т.к. что Они уничтожают дополнительное время сборки. Во-вторых, процедурные макросы очень сложно писать, и большинство людей в конечном итоге оказываются очень большими из-за вспомогательных функций. ящик, например syn ,это очень большое из Rust парсер,С радостью оценю весь прилагаемый к нему контент. Например,если Вы хотитесуществовать Макроссередина Комментарийодинфункцию и проанализировать ееизимя, syn В конечном итоге будет проанализировано все тело функции. Есть и другая ситуация, syn из Автор также serde из Автор, это популярный из Rust Сериализованная библиотека Где-то в прошлом году существовала исправленная версия библиотеки с двоичным файлом, который отвергал антиверно звук Сообществоиз. Это не антиверно Rust Конечно, но я думаю, об этом следует упомянуть, потому что Он показывает, как большая часть экосистемы состоит из сборок библиотек, созданных отдельными разработчиками, которые могут принимать потенциально опасные решения. Конечно, такая ситуация может произойти в любом языке, но особенно она важна с точки зрения процедурных макросов, потому что что система Экология Почти все использовано из библиотеки этого конкретного автора ( syn , serde , anyhow , thiserror , quote ,...). Даже если игнорировать вышеизложенное, процедурные макросы требуют очень крутой кривой обучения, и их необходимо выполнять индивидуально. crate определено в. Это означает, что в отличие от декларативных макросов создать новый процедурный макрос невозможно так же легко, как создать функцию. В сложившихся обстоятельствах существуют C# используется в Рефлексия – это очень легко,еслисекс能Нетдавопрос(существоватьиспользоватьотражениеиз情况下в целом Нетдавопрос),это Можетда Строитьинструментилиотлаживатьизочень быстрыйионо работаетиз Параметры。Rust не обеспечивает аналогичной функциональности, как существовал в прошлом году из Rust Событие(ThePhd Keynote событие)середина,Последний видОтражение времени компиляции[10]изнаправление Законбаза本начальствоотменен Понятно。

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

Нельзя отрицать, что это действительно так Rust серединаиздефект。В противном случае, Бэви Движок не будет реализовывать это сам по себе. bevy_reflection библиотека для решения этой проблемы。Однако,Автор статьи не упомянул Беви. Это библиотека отражений.

от Bevy По данным, встроенный Reflect trait Реализованы сериализация, десериализация и динамический доступ к атрибутам. Фактически, оно также основано на Rust Any trait Осознайте из.

Язык кода:javascript
копировать
// Deriving `Reflect` implements the relevant reflection traits. In this case, it implements the
// `Reflect` trait and the `Struct` trait `derive(Reflect)` assumes that all fields also implement
// Reflect.
#[derive(Reflect)]
pub struct Foo {
    a: usize,
    nested: Bar,
    #[reflect(ignore)]
    _ignored: NonReflectedValue,
}

#[derive(Component, Reflect, Default)]
#[reflect(Component)] // this tells the reflect derive to also reflect component behaviors
struct ComponentA {
    pub x: f32,
    pub y: f32,
}

Это обеспечивает динамический доступ к полям:

Язык кода:javascript
копировать
fn some_system() {
    let mut value = Foo {
        a: 1,
        _ignored: NonReflectedValue { _a: 10 },
        nested: Bar { b: 8 },
    };

    // You can set field values like this. The type must match exactly or this will fail.
    *value.get_field_mut("a").unwrap() = 2usize;
    assert_eq!(value.a, 2);
    assert_eq!(*value.get_field::<usize>("a").unwrap(), 2);

    // You can also get the &dyn Reflect value of a field like this
    let field = value.field("a").unwrap();

    // you can downcast Reflect values like this:
    assert_eq!(*field.downcast_ref::<usize>().unwrap(), 2);
}

bevy_reflection Он также претерпел несколько версий и итеративных улучшений. Беви Сделай это хорошо есть Сообщество. Содержание его Сообщество хорошее, оно отражается каждый год и организуется. bevy игра jam Сравниватьраса,на самом делеодинигра Двигатель Разработка не может быть отделена от пользователейизобратная связь。

Может быть, потому что что Bevy Сообщество действительно хорошо справляется, поэтому все его хвалят. Bevy,Bevy существовать Rust Сообщество имеет определенное влияние, даже Rust Код компилятора содержит Bevy И специально писать из кода.

но Потому что автор не одобряет Bevy ECS Everything из концепции, поэтому не думаю, что он ею воспользуется bevy_reflection библиотека.

«Горячая перезагрузка более важна для скорости итерации, чем думают люди»

автор Настоятельно рекомендуетсякаждыйигра Разработка Зрителисмотреть Tomorrow Corporation Tech Demo[11] В этом видео вы узнаете о горячей перезагрузке, обратимой отладке и разработке игры с помощью общего инструмента.

Чем занимается команда Tomorrow Corporation:

  • Создан собственный язык изпрограммирования.、редактор кода、Игра Двигатель、Отладчик игра.
  • существуют Поддержка горячей перезагрузки встроена во весь стек.
  • Обратимая отладка путешествий во времени с временной шкалой, которая может переключаться между состояниями существующей игры.
  • Другие... просто посмотрите видео :) Гарантирую, вы не пожалеете.

Автор также осведомлен о существующих платформах (например, .NET) и местных языках (например, .NET). C++или Подобный функционал построить в Rust практически невозможно), но он тоже с этим не согласен, потому что что это сложно и не сработает на 100%, с этой точки зрения нам не следует заниматься этими вещами.

Unity выбирать C# Язык существует не без причины, потому что что C# Поддерживает горячую перезагрузку. существовать Unity В настоящее время существует еще один, посвященный Unity Индивидуальная реализация hotreload.netАвтор заявил, что это было его возвращение в Unity Разработано и заброшено Rust из Основная причина。такжедаихвыбирать Unity вместо Godot или UE5 из-за причины. (в настоящий момент Godot Не поддерживается.NET Горячая перезагрузка, UE еще только blueprints и C++。)

Rust Языковой уровень не поддерживает «горячую перезагрузку», но экологическая библиотека предоставляет некоторые решения, такие как Сравнивать. hot-lib-reloader-rs[12] , основано на libloading план может Bevy используются вместе. Альтернативно вы можете использовать lua Язык для реализации горячей загрузки, например `yazi`[13]

но,Это определенно не так удобно, как поддержка на уровне языка.,Плюс Rust ABI нестабильен.,такдинамическая библиотекаизэтот种направление案также Нетда很通использовать。

Автор признается, что пытался hot-lib-reloader и обнаружил, что он далек от совершенства даже для очень простого варианта использования — простой перезагрузки функции. Раньше он сталкивался со многими случайными проблемами и, в конце концов, сдался, потому что что это приносит проблемы. Сравнивание спасает от проблем больше. Даже это crate Это не проблема, это не может решить проблему случайной настройки вещей, потому что что оно по-прежнему требует планирования и предвидения, что снижает потенциал существованияизтворчества.

«Абстракция – это не вариант»

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

Автор упомянул из UI В сценариях программирования (с использованием egui-rs),Он изначально хотел передать статус напрямую туда, где он нужен.,Уменьшите сложность разработки с помощью упрощания кода. Однако,потому что Rust заимствуя правила, этот прямой подход вызовет ошибки компилятора, потому что что это нарушает Rust из Правила одновременного заимствования(Не может быть переменных одновременноинеизменяемая ссылка)。поэтому,Авторы вынуждены делать дополнительные абстракции для управления состоянием.,Например, применять клоны государства, чтобы избежать заимствования правил и ограничений.

Язык кода:javascript
копировать
if let Some(character) = &self.selected_duck {
    character_select_duck_detail(.., character, self);
} else {
    character_select_no_duck(...);
}

Автор показывает эту часть кода, которая решает проблему согласно текущему выбору. duck из статуса (независимо от того, выбран или нет) duck),Динамически решать, какую панель сведений отображать。этотвнутрииспользовать Понятно Rust из if let Структура для выполнения условного суждения и деконструкции.

Автор существуют попытки self и self Я столкнулся с проблемой при передаче поля из в качестве параметра функции. потому что что Rust Одновременное изменение не допускается.и Непременно заимствовать то же самоевернослон(self),Это заставляет разработчиков более детально управлять государственной собственностью.,илииспользоватьнравитьсяклонироватьэтот Образецизнаправление Закон Приходитьвокруг Проходитьэтотнекоторый限制。Этот точный жизненный цикл и владение строгими требованиями фактически обеспечивают надежную организацию кода и доступ к данным на основе абстракции.

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

Эта необходимая абстракция может не только увеличить сложность кода.,Это также может снизить эффективность разработки.,потому что Это заставляет разработчиков тратить время на изучение языковых правил, скорее, Чем Решайте бизнес-задачи напрямую. Автор применяиспользовать клоунское выражение (🤡), чтобы верно выразить данную ситуацию, из чувства юмора и некоторой иронии, подчеркивая Хотя Rust существование превосходно во многих аспектах, но в некоторых повседневных задачах развития его строгость может привести к неэффективности.

Как сказать,В мире нет идеальных вещей,этотили Можетто есть Rust Сохранность языковой памяти гарантирует «Тёмная сторона» Бар.

«Состояние графического интерфейса Rust ужасно»

Автор считаетигра UI Это то, что необходимо очень стилизовать, визуализировать, сконструировать. UI Самое сложное — кастомизация UI Внешний вид и опыт.

Автор использовал egui Построена большая часть из UI, но такое ощущение, что его существование не оптимально во многих аспектах.

и egui из Автор начал существующий бизнес по созданию мультимодальной среды визуализации. rerun

Экосистема графического интерфейса Rust действительно плоха.

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

Rust Есть много в GUI библиотека, которая использует множество различных методов. Некоторые из них существуют GUI Привязки библиотек, некоторые в немедленном режиме, некоторые в реактивном режиме и даже в сохраненном режиме. Некоторые попытки использовать Flexbox, в то время как некоторые другие не занимаются макетированием на базовом уровне.

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

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

существовать Rust В системе экологии пока нет ни одного решения, которое бы стремилось «хорошо создавать игры». GUI”。

«Правила-сироты должны быть необязательными»

Сиротские правила,Проще говоря,то есть「Вы должны осознать из trait и Тип должен иметь локальное определение. В настоящее времясуществовать Rust середина обязателен из.

Сиротские правилаизжитьсуществоватьда Разумныйиз,потому что можно избежать различных trait Осознайте конфликт.

но Автор считает, существует В некоторых сценариях следует разрешить «отключить правило сирот». ИграEngineиFrameто есть хороший пример, используйте Macroquad или Comfy этот Образециз Библиотекаизлюди并Нетнуждатьсясуществоватьихизкодбиблиотека Соблюдайте правила изоляции。верно В"Тип рамы"из Библиотека Приходитьобъяснять,Возможность расширения существующей функциональности без разветвления.,А обеспечение более унифицированного опыта для конечных пользователей было бы очень полезно.

«Время компиляции улучшилось, но не при обработке процедурных макросов»

Rust Время компиляции в целом улучшилось, по крайней мере, существует Linux Так и есть. существовать Windows Инкрементные сборки по-прежнему выполнялись значительно медленнее, что вынудило автора перейти на Linux(3-5 разница в разы). носуществовать После покупки нового настольного компьютера высокого класса соберите его из 10k База линейного кода занимает всего несколько секунд.

В качестве хорошего примера, comfy-ldtk изсторесуществовать - это просто завернуть отдельный файл и убедиться serde из Мономорфизм существует существование единственного из crate середина. Это может показаться тривиальной деталью, из-за которой получается разница во времени. Linux начальствоиз 2 секунды увеличились до 10 Второй. верно Ю 1600 С точки зрения определений структуры строк это довольно большая разница.

Автор чувствует, что некоторые люди осознают,еслиихизкомпилироватьчасмеждуда 0.5 Второйвместо 30 Секунды, насколько изысканной будет их игра. графический интерфейс Подобные вещи, по сути, требуют постоянной корректировки, за исключением godot-rust из Кроме пользователей,Чтоонлюди Все将Нет得Нет多次重启играсделать интерфейссмотретьрост Приходитьхорошийсмотреть。еслитыверно Это выражает несогласие,Что Что?Сразупожалуйста, дайтеавторпоставлятьодиниспользовать+30 Секунды дополнительного времени сборки. Очень усовершенствованная сборка. GUI из Пример.

верно В GUI Развитие Это действительно проблема, но это не значит, что это проблема во всех ситуациях.

«В экосистеме разработки игр на Rust хайп»

Автор считает Bevy существовать Маркетинг Сравниватьболее выдающийся。

Сразусуществоватьнесколько дней назад,Brackeys Написали об их возвращении Godot Провести разработку из видео. Когда я посмотрел это видео и начал слышать обо всех этих удивительных игровых движках с открытым исходным кодом, у меня уже возникло предчувствие. существует ок. 5:20 На тот момент в видео была показана карта рынка игровых движков. Могу только сказать, что видел три. Rust игровые движки, особенно три: Беви, Арете и Окружающий. Теперь я хочу внести ясность: этот пост в блоге не является атакой на какой-либо конкретный проект, и я понимаю, что эти проекты не несут ответственности за то, что другие люди делают в своих видео. Но в то же время это стало Rust мирсерединаизтема,Это даже мем,Я думаю, нам стоит поговорить об этом вопросе.

Rust Экология обычно работает следующим образом: независимо от доступности проекта, если он берет на себя максимум обязательств, демонстрирует веб-сайт/файл readme и имеет наиболее впечатляющие GIF Широко восхваляться будут изображения, которые, главное, привлекают правильные абстрактные ценности. А есть и другие проекты, которые обычно остаются в тени, потому что чтоони Нет够吸引люди,Нет никакой гарантии, что функция не может быть реализована.,Он просто пытается выполнить задачу эффективным способом.,Эти проекты почти никогда не упоминаются.,или считается худшим выбором, когда упоминается.

Для этого автор приводит три примера:

  • Macroquad,этодаодин Очень Реальностьиспользоватьиз 2D игровая библиотека, которая может работать практически на всех платформах и имеет очень простой интерфейс. API компилируется очень быстро, практически не имеет зависимостей и создается одним человеком. Также имеется вспомогательная библиотека. miniquad ,существовать Windows/Linux/MacOS/Android/iOS и WASM начальствопоставлять Понятноодин Графическая прокачкаслонслой。Однако Макроквад существовать Rust Самая серьезная ошибка была допущена в экологической системе: естьиспользовать глобальное государство, может даже unsafe из。每当иметьлюдинестик этомучас,Этот вопрос будет задаваться всегда,потому что это не соответствует Rust из конечного значения, т.е. 100% безопасность и корректность.
  • Fyrox,этодаодин具иметь Реальность际完整 3D Редактор сцен, системы анимации, похоже, соответствуют всему, что вам нужно для создания игры. 3D Игровой Двигатель. Этот проект также выполнил человек, который также сделал полную версию двигателя. 3D игра. Хотя у него есть полноценный редактор, и Bevy Это неоднократно обещалось на протяжении многих лет (но не было выполнено), это не так хорошо, как Bevy Понимать маркетинг, а не только star 。
  • godot-rust ,это Godot Двигатель Rust Привязка. Самая серьезная проблема с этой библиотекой заключается в том, что она не является чистой. Rust из решения, но, правда, "грязное" из C++ Двигательобязательность。Немного преувеличено,но Чтонекоторыйотвнешнийсмотреть Rust Люди могут быть удивлены, обнаружив, насколько это иногда близко к реальности. Ржавчина чист, Раст правильно из-за, Раст Это безопасно. С++ Это плохо, старо, некрасиво, небезопасно и сложно. Это есть Почемусуществовать Rust игра В разработке, не используем СДЛ, у нас есть winit ,мы неиспользовать OpenGL, у нас есть wgpu ,мы неиспользовать Box2D или PhysX, у нас есть rapier , у нас есть kira Для игрыаудио мы не используем Dear ImGUI, у нас есть egui , самое главное, что мы точно не сможем его использовать C++ Написать из существующего игрового движка. Это нарушит все правила использования. rustup default nightly Чтобы получить более быстрое время компиляции, это достигается в лицензии Sacred Crab Codex (то же самое запрещено нашим официальным использованием Rust Фонд признает товарный знак (торговую марку)).

еслииметьлюдинастоящийиздуматьсуществовать Rust Совершите настоящую изигру, особенно 3D игра, моя первая рекомендация — использовать Godot и godot-rust ,потому что, по крайней мере, у них есть шанс предоставить все необходимые им функции, потому что что Они могут положиться на настоящий двигатель, который поможет им добиться успеха. Мы потратили годиспользовать Godot 3 и gdnative а также godot-rust строить BITGUN, хотя этот процесс существования болезненный во многих отношениях, но это не привязка, это неправильно, это потому что что Мы стараемся смешивать множество вещей всеми возможными и динамичными способами. GDScript и Ржавчина. Это наш первый и самый крупный из Rust Проект – это тоже то, за что мы берёмся Rust Дорога из разума, в конечном итоге я хочу сказать, мы воспользуемся Rust Создание изEvery игры больше не выглядит как игра, а просто потому, что что Мы потратили много времени на решение и Rust Определенные части языка, экологии и некоторые дизайнерские решения не связаны с техническими проблемами, но эти проблемы что язык строгий и трудно решаемый. я не скажу GDScript и Rust Из-за совместимости это просто, но это абсолютно верно. Но, по крайней мере, есть вариант «просто делай дела и двигайся дальше». Годо. Я чувствую, что большинство пробует только решения на основе чистого кода, а люди не воспринимают это всерьез, особенно существующие. Rust , язык может препятствовать творчеству многими неудобными способами. Сразу Bevy Я верю, что это показано как «основное» из Rust Игра Двигательсуществоватьочень большойстепеньначальствода Разумныйиз,еслииметь什Что?причина,Чтодапотому Размер проекта и количество участников. Им удалось построить очень большое сообщество Сообщество. Хотя я могу не согласиться с их обещаниями и лидерством в некоторых выборках, но я не могу этого отрицать. Bevy Очень популярен.

Должен сказать,Об этом говорит автор,确Реальностьтакжедаслучай Реальность。как Rust СообществоFromГлубоко Rust языккультурное влияниеизя,я тоже очень согласен Автор говоритприезжатьизэтотнемного:хочу чисто Rust реализует всё。возможныйятакжедаодинпуризм ВОЗ。

Но я не думаю, что в пуристах есть что-то плохое.,этотиндивидуальныймирначальствокаждыйлюди Всеиметь Собственныйизсчастьехороший。Мы можем сами использовать выборки, если захотим.,Но я не заставляю других использовать то, что мне нравится.,Сразубез什Что?вопрос。Мы выбираем использовать библиотечный фреймворк, разве это не первородный грех?

Bevy Автор может подумать, что это коммерческий проект с открытым исходным кодом, целью которого является создание собственного сообщества и развитие собственной экологии. Bevy Чрезмерный маркетинг, всегда обещающие что-то, но не реализующие их. Но действительно ли здесь нет никаких личных эмоций?

Rust / bevy Слишком много чрезмерного маркетинга. Что вы думаете Шерстяная? ткань?

«Глобальное состояние раздражает по неправильным причинам, игра однопоточная»

верно Глобальное состояние из Общее «отвращение» — это спектр,большинство людей не будут полностью противиться этому. носуществовать Обсудить игру Разработка,Автор считает, что это неправильное направление.

существоватьигра Разработкасередина,Многие системы (такие как аудиосистема, система ввода, физический мир, рендерер и т. д.) обычно доступны только из,Поэтому глобальное состояние разумно и удобно. существуют В этом случае,Глобальное состояние не только упрощает структуру кода,Также уменьшает ненужную передачу параметров.,Упрощает управление и понимание кода.

существовать Comfy Многие вещи в нем используют глобальное состояние:

  • play_sound("beep") использовать ВВоспроизвести одноразовый звуковой эффект。если Нужно больше контроля,Можетиспользовать play_sound_ex(id: &str, params: PlaySoundParams)
  • texture_id("player") используется для создания TextureHandle для ссылки на ресурс. Нет сервера ресурсов для доставки, потому что в худшем случае я могу использовать путь в качестве идентификатора, и потому Путь уникален, и, очевидно, идентификатор тоже будет уникальным.
  • draw_sprite(texture, position, ...) или draw_circle(position, radius, color) для рисования. потому что чтокаждый Не игрушкадвигатель Все会批量绘制调использовать,такэтотнекоторыйдвигатель Нет会Сравнивать Нажмите команды рисованияприезжать某индивидуальный队列середина更多做什Что?。

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

он думает Bevy Будет ли все асинхронно и работать в пуле потоков, да? Bevy Одна из самых больших ошибок。Bevy изпараллельныйсистема Модель очень гибкая,дажесуществовать Несогласованность между кадрамииззаказ。еслидуматьдержатьзаказ,Должно быть указано ограничение.

Поначалу это казалось разумным из-за того, что автор много раз пытался существовать. Bevy После создания одного из них в 2017 году (месяцы разработки, десятки тысяч строк кода) в итоге пользователю пришлось указать множество зависимостей, и потому В этой игре события часто должны происходить в определенном порядке, чтобы избежать случайной задержки чего-то существующего на один кадр во время работы, или, что еще хуже, иногда поведение становится странным, потому что что ты понял AB вместо БА. Когда вы зададите этот вопрос, вас встретит яростное опровержение, потому что что Bevy изупражнятьсясуществоватьтехнологияначальстводаправильныйиз,новерно С точки зрения фактического производства игры,Но это множество бессмысленных ритуалов.

К сожалению, это,существуют После завершения всех работ, требуемых системой,Места для распараллеливания не так много. на самом деле,отсерединаполучатьизнемного点хороший处将等такой же Виспользовать rayon Распараллельте чисто изданную систему драйверов способом распараллеливания данных.

Оглядываясь назад на годы Приходитьизигра Разработка,ясуществовать Unity используется в Burst/Jobs писатьизпараллельныйкод Сравниватьсуществовать Rust игра в из гораздо более реализована, обе существуют Bevy В пользовательском коде или его существовании это просто потому, что Большая часть работы по разработке остается сама по себе, оставляя достаточно энергии для решения интересных задач. И существуют почти каждый Rust В проекте Я чувство Большая часть энергии тратится на язык борьбы, или я создаю вещи вокруг языка, или, по крайней мере, я слежу за тем, чтобы этого не происходило, потому что что некоторые вещи выполняются особым образом, и теряется слишком много комфорта разработчика, потому что что Rust Попросил это сделать. код существования игры, нам нужно обернуть некоторые вещи, которые существуют Mutex<T> или AtomicRefCell<T> в, не написано во избежание существования C++ проблема", а удовлетворить всеобъемлющее желание компилятора сделать все потокобезопасным, даже если во всем коде его нет. thread::spawn

Я прекрасно понимаю настроение автора,至этоттакже明白Понятноон Почемухотеть Собственный造Игра Двигатель。ониспользовать Bevy , вы вынуждены использовать асинхронный Rust , хотя в его коде нет необходимости в многопоточности. Он хотел более простого решения, но у него не было другого выбора, кроме как «поддаться». Rust Экологические правила безопасности.

«Динамическая проверка заимствований вызывает неожиданный сбой после рефакторинга»

ихсуществоватьиспользовать RefCell<T> Я сталкивался с этой проблемой снова и снова: два .borrow_mut() Перекрытие приводит к неожиданному сбою.

случай Реальностьда,этотнекоторыйвопрос并Нет总дапотому что "плохо из кода". Люди скажут: «Попробуйте занять как можно более короткое время», чтобы решить проблему, но это не бесплатно. Очевидно, это опять-таки зависит от того, как структурирован код, но я надеюсь, что мы установили, что разработка — это не серверная разработка, и код не всегда организован оптимально. Иногда цикл может потребовать использования RefCell серединаизчто-нибудь,将借использовать延伸приезжать整индивидуальныйцикли Нет仅仅дануждатьсяиз地направлениеда很иметь道理из。если Цикл достаточно велик и, возможно, вызываетсуществовать Внутри требуется тот же блокизсистема,Обычно с некоторой условной логикой,Это может вызвать немедленные проблемы. Можно снова возразить, что «просто используйте косвенную цитату».,И выполнить условную обработку происходящего события",Но таким образом,Мы будем существовать библиотека кода, распределенная игровая логика.,и Нет仅仅даиметь 20 строки явно читаемого кода.

первый,Этот внутренний контейнер изменчивости полезен для разработки.,подтверждатьда常использоватьиз。потому Часто бывает необходимо разделить статус игры и внести изменения между различными компонентами исходной системы.

существоватьиграциклиспользуется в RefCell час,общийизвопросда借использоватьизчасмеждувозможный Сравниватьфактические потребностиизчасмежду长。еслисуществоватьциклсерединаполучать RefCell иззаимствовать и существовать удерживать его на протяжении всего цикла, затем существовать любая попытка изменить его во время выполнения цикла RefCell Любая операция в данныхиз нарушит правила заимствования и приведет к ошибкам во время выполнения. Это потому что что RefCell Цель состоит в том, чтобы разрешить временное, условное и непрерывное заимствование в логическом потоке.

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

новерно Потому что автор вообще не хочет рассматривать какие-либо архитектурные решения и сценарии,Я просто хочу быстро реализовать эту функцию и не хочу тратить на это больше умственных способностей.,Тогда это наверное недостаток

«Объекты контекста недостаточно гибки»

авторуказать,существовать Rust Недостаточная гибкость при передаче глобального состояния в качестве контекста.

Вообще говоря, Rust передачаначальство下文иметь两种направление案:Передать ссылку и Подсчет ссылок(общийвсеверно)。

Передать ссылка будет проблема, то естьможет вызвать「Каскадный рефакторинг」。Сравниватьнравиться:

Язык кода:javascript
копировать
struct Thing<'a>
  x: &'a i32
}

еслия Мы сейчассуществоватьдуматьхотетьодин fn foo(t: &Thing) ..., Thing является общим для жизненного цикла, поэтому он должен стать fn foo<'a>(t: &Thing<'a>) или Худший。еслия Мы стараемся Thing Сохранив существование в другой структуре, теперь существуем получаем из:

Язык кода:javascript
копировать
struct Potato<'a>,
  size: f32,
  thing: Thing<'a>,
}

Хотя Potato Наверное, все равно Thing ,носуществовать Rust Жизненные циклы очень серьезны, и мы не можем их игнорировать. На самом деле ситуация со Сравнивать выглядит хуже, потому что что Предположим, вы наконец выбрали и попытались использовать жизненный цикл для решения проблемы.

когда вы позже измените Thing,идти Терять Понятно 'a,ты Нет得Неттакже得修改 Potato。этотто есть Каскадный рефакторинг. Автор заявил, что это одна из вещей, которая его раздражает больше всего: он пытается внести очень простые изменения в жизненный цикл только для того, чтобы быть вынужденным менять его каждый раз, когда он меняется. 10 Другое место.

кроме тогоодинвопросда,сверху вниз вызовет проблемы с проверкой займа.

Язык кода:javascript
копировать
struct Context<'a> {
  player: &'a mut Player,
  camera: &'a mut Camera,
  // ...
}

но,Если вы хотите запустить систему проигрывателя,Но я также хочу сохранить камеру:

Язык кода:javascript
копировать
let cam = c.camera;

player_system(c);

cam.update();

Вы получите сообщение об ошибке проверки займа: «Невозможно занять c ,потому что оно было заимствовано».

конечно,Есть много решений этой проблемы. но,Автор не намерен использовать эти методы.

я Нетдадля Понятно Наслаждайтесь типомсистемаи Узнайте лучшееиз结构组织направление式以让компилировать器满意иделатьигра。

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

Преимущества ржавчины

Хотя статьяиз Чтоончастьавторверно Rust высказал некоторую критику, но также дал Преимущества ржавчины(в противном случаеонтакже Нет会использоватьтри года):

  1. «Он компилируется правильно»:Rust Компилятор существует, что дает большую гарантию правильности кода. Опыт автора показывает, что пока код может Rust из компиляции, то существующий код обычно работает должным образом при запуске. Этот подход «разработки на основе компилятора» существует. Rust Производительность особенно выдающаяся, помогающая разработчикам избежать многих распространенных ошибок при программировании.
  2. Инструмент командной строки иданная обработка:Rust существующие хорошо зарекомендовали себя в создании инструментов командной строки и реализации алгоритмов обработки данных. Автор материала обычно использует Python или Bash Используется для завершения миссии Rust осознать, обнаружить Rust Это не только компетентно, но и часто приносит неожиданную пользу.
  3. Высокая производительность по умолчанию:и C# Взаимно Сравнивать,Rust существующие имеет очевидные преимущества с точки зрения производительности. хотя C# Производительность можно улучшить с помощью оптимизации, но существующие авторы протестировали, Rust производительность обычно лучше. Это особенно очевидно при реализации конкретного алгоритма. кодв целом能自Однако Рандидаприезжатьвышеиз Эффективность исполнения。
  4. Перечисления и сопоставление с образцом:Rust серединаизперечислять(Enums)исопоставление с образцомдаавтор Особая благодарностьиз Функция。существовать Применимыйизсцена,Перечисления и сопоставление с образцом придают коду ясность, структуру, строгую типобезопасность и,Это существующее авторское использование является одной из самых популярных реализаций на языке.
  5. Rust Analyzer:Rust Analyzer — чрезвычайно полезный инструмент, и хотя иногда с ним возникают проблемы, он значительно улучшает Rust из Опыт программирования. от Rust изутроверсия выпускаприезжатьсейчассуществовать,Языковые периферийные инструменты достигли большого прогресса,Значительно повышает эффективность разработки.
  6. trait:Хотя Rust Традиционное объектно-ориентированное наследование не поддерживается, но его особенность обеспечивает гибкий и мощный способ реализации полиморфизма интерфейса и поведения. черта системакостюм Rust Из философии дизайна, несмотря на существование существующих ограничений правила сирот, расширенные функции по-прежнему актуальны. Rust Одна из любимых работ автора.

Некоторые комментарии к этой статье в социальных сетях

Rust Союз языковых команд Leader JoshTriplett[14] верноэтот ответ

первый,Большое спасибо, что нашли время написать этот пост. Люди, покидающие Rust, обычно не пишут о своих проблемах.,Для нас это огромная проблема,потому что Это означает, что мы в основном слышим голоса только тех людей, чьи проблемы недостаточно, чтобы оттолкнуть их. Спасибо вам огромное, правда, спасибо за готовность подробно объяснить проблему, с которой вы столкнулись. Мне также очень сочувственно и жаль слышать, что вам, кажется, несколько раз говорили, что проблема в том, что что Вы не правы: используйте Rust или попотому чтоиспользовать ПонятноArcилипохожийизвещьиуниженный,Или в любой другой момент, когда вы чувствуете себя виноватым. люди не должны этого делать,ятрудный Проходить还иметьлюдиэтот Что?做。 (По теме: Можете ли вы описать случай, когда вы столкнулись с таким снисходительным отношением? Я существую. Я не видел, чтобы это происходило в кругах Rust, которые я часто посещаю, но это явно так. существования случается, и я вижу жалобы на это довольно часто и надеюсь, что этого не произойдет. Иногда мы пытаемся предоставить некоторую официальную информацию, чтобы прекратить это снисходительное отношение, но, возможно, мы можем сделать больше.) яноутбукначальствоиметьодин“сохраняй спокойствие и позвониClone”изнаклейка,верно ВArcипохожийизвещьтакжеданравитьсяэтот,Особенно, когда вы пытаетесь оптимизировать скорость прототипирования и скорость итерации. Быстрые исправления для запуска работы не являются проблемой. Вы существуете из многих из проблем, упомянутых здесь, действительно являются общими шаблонами реальных проблем в языке Rust или экологических системных библиотеках. Например,Сиротские правила Абсолютновернодаодинвопрос。Это влияет на экологию во многих отношенияхсистемаизшкала。этотиметь в видуеслитыиметьодинпоставлять特сексиз БиблиотекаAи Укажите типиз БиблиотекаB,Либо A должен добавить дополнительную поддержку B.,Либо B должен добавить дополнительную поддержку A.,Или Кто-то должен придумать новый тип обертки, чтобы решить эту проблему. в целом,менее популярныйиз Библиотека最终会для更受欢迎из Библиотека Добавить необязательноподдерживать。этотда Почему Очень难以дляserdeписать Заменятьизодинпричина:тыдолжен позволитьглазвпередпоставлять可选serdeподдерживатьизкаждый Библиотекатакжедлятыиз Библиотекапоставлять可选поддерживать。 существует другая экологическая система, вы либо существуете, быстро и грязно добавляя поддержку в свое приложение, либо пишете (и, возможно, публикуете ) Реализация AиB вместе с поддержкой библиотеки A-B. Это также должно быть возможно в Rust. верно Здесь есть несколько возможностейсуществоватьизязык解决направление案。Самый простойиз,Может быть довольно простым и поможет во многих приложениях.,будет «тип может иметь только один реализованный атрибут»,еслииметь多Водинизвыполнить,выдает ошибку компилятора. Немного более сложное правило: «Идентичные реализации допускаются и рассматриваются как одна реализация». Это было бы очень удобно в сочетании с каким-то «независимо производным» механизмом, который генерировал бы ту же реализацию везде, где это необходимо. Привет,смотреть,Мы пришли сюда с еще одной очень разумной жалобой.,то есть макроссистемаи拥иметь某种отражениеизверно Сравнивать。яих应该поставлять足够изподдерживать Приходитьвыполнитьодиннезависимыйизderive Trait for Typeмеханизм。它Нет必да Идеальныйиз,верно Многие полезные предметы достаточно хороши. Здесь из некоторых других вопросов также могут быть решения,Стоит попытаться разобраться, что нужно для их решения. в любом случае,Еще раз спасибо, что написали это. Я планирую надеть языковую шляпу и попытаться решить некоторые из этих проблем.,И предложите другим прочитать эту статью.

Комментарий от старшего gamedeviz:

якак一名拥иметь超Проходить 12 Мнение разработчиков с 20-летним опытом заключается в том, что в долгосрочной перспективе выгоднее «делать так». Автор хочет существовать, чтобы оптимизировать свои усилия в краткосрочной перспективе, в то время как я надеюсь, что существую, чтобы оптимизировать свой успех в долгосрочной перспективе. Это, конечно, скользящая шкала, но точка зрения автора прямо противоположна. Они хотят быстро повторить кодирование в стиле «установил и забыл», чтобы проверить, работают ли сиюминутные идеи, во многом как прототипирование. Я хочу быть уверен, что пишу код, который делает как можно меньше ошибок, включая соответствующую обработку крайних случаев и условий возникновения ошибок. верно для бывшего, как Lua Этот язык достаточно хорош, и по этой причине многие разработчики игр используют его. верно для последнего, например Rust Этот язык достаточно хорош, многие обращают внимание На долгосрочную ремонтопригодность инженерам правда очень интересно. я использовал JavaScript、Python и Lua писать Проходитьигра,Обычно с таким же небрежным отношением,Просто бросьте что-нибудь вместе,также Может Вернись позжесмотретьсмотреть。этотверно В立即满足某种нуждаться Приходитьобъяснять Оченьхороший。но,еслиянуждаться负责修复Чтонекоторыйкодсерединаизошибка,этот Сразустановиться Понятноя Жизньсерединаизкатастрофа。еслиты能让维护становитьсядля别людиизвопрос,Чтото есть Идеальная стратегия развития Selfish. (РЕДАКТИРОВАТЬ: Это ненужный комментарий, который я сделал о себе. Это не укол в чей-либо проект.) Оглядываясь назад на весь беспорядочный код, который у меня был в моих предыдущих проектах, я понимаю, что они были буквально неприкосновенными. Луа и другие языки не подходят для исправления ошибок без поломки других вещей. С другой стороны, я ценю Rust из лимита. Такой язык мешает навлечь на себя неприятности. Это заставляет задуматься об изменчивости. потому что чтоеслиты Нет考虑它,Чтото есть Вы только что сообщили об ошибке. Это Rust ошибки будут подавляться. Ржавчина Требуется обрабатывать крайние случаи. Таким образом, ваш код не будет слепо продолжать выполнение, когда произойдет ошибка и кто-то сделает неверное предположение. Когда существование прямо критикует то, что я написал, я испытываю сильное чувство когнитивного диссонанса между «существование сейчас — это просто решение проблемы и исправление ее позже» и «быстрый и эффективный код». (Редактировать: Когнитивный диссонанс - это нормально из-за! Я тоже в этом виноват. Я люблю животных, но ем мясо. В какой-то степени из-за когнитивного диссонанса неизбежен из.) Выбор Rust дапотому Если вы хотите, чтобы игра действительно работала быстро на более медленном оборудовании, но вы ожидаете, что «быстро из кода» должно быть свободно, вы можете игнорировать такие детали, как копирование между клонами (включая статические выделения, распределение кучи и Подсчет вариант указателя ссылок). Континуум между «лучшим кодом» и «быстрее» основан на ваших краткосрочных и долгосрочных целях. Может быть, ты можешь сказать мне Lua Какой извыбирать наиболее подходящий? может быть JVM или CLR. Возможно, веб-браузер. Из всех имеющихся на данный момент вариантов, для меня верно Ржавчина. Вывоз мусора не рассматривается. И потому что у меня есть менталитет «долгосрочное/сейчас существующее», я верю, что в будущем будет Сравнивать Rust Что-то более подходящее для меня. Другой пример: они специально указали, что некоторые вопросы «самостоятельны». Вызвано «из» и позднее стало считаться глобальным состоянием. bevy из ECS Легче реализовать. с определенной точки зрения это может быть и так, но это игнорирует глобальное состояние и неизбежно приводит ко всем ошибкам. Обычно ошибки изменяемых псевдонимов (например, macroquad упоминается в разделе «Неполнота») или более общих проблем (таких как The Problem With Single-threaded Shared Mutability - In Pursuit of Laziness (описано в manishearth.github.io)) — это глобальные государственные проблемы. Но настоящая проблема заключается в существовании «глобального государства». ECS Границы, проведенные между «состояниями», полностью искусственные из-за (даже созданных вами) ограничений. Игра может одновременно использовать глобальное состояние. ECS, это не вопрос выбора. Это не значит, что это будет легко. На самом деле трудно совместно использовать изменяемое состояние, локальное или глобальное, независимо от языка реализации. Они абсолютно правы, Раст. Больше, чем просто инструмент «сделай это». Это инструмент, который выполняет работу правильно и с высокой производительностью. Есть много других языков, которые могут «выполнить свою работу», но это часто происходит за счет корректности, производительности и того и другого. большинство AAA сортигратратить годы(дажедесять летилидольшечасмежду)руководитьразвивать。еслиэтот Нетдадля Понятнодолгосрочное развитие,Я не знаю, что еще. Я могу понять эту точку зрения, правда она справедлива независимо играиз,еслислепойглаз地应использоватьизразговаривать。ноя Взаимнописьмобольшинствонезависимыйигра Разработка ВОЗНет Толькодакаждый Ежемесячное написаниеодинигра。этотнекоторыйиграочень большойстепеньначальство Все Нет会取得任何становиться功。ии,если Чтосерединаодинигра确Реальность取得Понятностановиться功,Тогда им нужно исправить ошибку. Поддержка, к которой они не имеют доступа из-за конфигурации оборудования. Новый контент предоставляется в соответствии с ожиданиями Сообществоиз. и т. д. верно, позволь мне сказать тебе,Это очень похоже на долгосрочное обслуживание.

еслиты действительноиз Нетзакрывать心Безопасностьсекс(尤Чтодаесли您ужеприезжать Понятно更счастье欢использоватьпозволять Может多индивидуальный可变借использоватьиз“Нет Безопасность”языкизстепень),существовать Bevy В вы всегда можете использовать get_unchecked путь побега. существует "Все, что я хочу делать" из игры среды разработки, Я думаю, в этом нет никаких проблем. и,Когда существование «безопасности» из кодовой базы осуществляется в более широком контексте,Вы можете сделать и то, и другое.

какодиндлинныйотслучайигра Разработканоновыйрука Rust Разработчик, эта статья потрясающая и определенно сэкономит мне время и избавит от разочарований. Я все еще хочу попробовать и знать, чего ожидать (некоторые из обсуждаемых вами вопросов являются подтверждением уже имеющихся у меня опасений). Я только что купил Нерасслабляющий Шарлатанов», чтобы сказать спасибо (и поздравления с релизом!)

этотда Оченьхорошийизстатья。онсуществоватьмногоаспект Всеправильныйиз。 я использовал Rust Я пишу клиент Metaverse уже много лет. Да Second Life и Open Simulator сервер вместеиспользовать。этотда一некоторый[видео](https://video.hardlimit.com/w/7usCE3v2RrWK6nuoSr4NHJ[15])。кодиметь大约 45,000 Безопасность путешествия Rust。 существовать Rust Дела Китая серьезны 3D Очень мало людей разрабатывают игры. иметь Велорен, и я из вещей, и, возможно, еще несколько человек. Большой, популярной игры не существует. Я думал, что сейчас должно быть что-то существующее AAA Уровень игры используется Rust Напишите из. Но этого пока не произошло и, вероятно, не произойдет, и вот почему есть Автор упомянул из. онобъяснять得верно,Рефакторингизбольимежду разными частями программыиз Трудности межсоединенияданастоящий Реальностьжитьсуществоватьиз。Некоторые изменения часто требуют обширногоиз Работа。еслии Связь с серверомиз Потребности клиентаи 2D GUI Для связи он должен поставить событие в очередь. Ситуация с рендерингом почти приемлемая, но стек не полный, но надежный. 2D GUI система слаба и требует слишком много кода для каждого диалогового окна. Я склонен согласиться с проблемой «асинхронного загрязнения». «Асинхронная» система предназначена для тех, кому необходимо запускать очень большие объемы Web Сервер, есть большое количество клиентов, отправляющих запросы, и люди оптимизируют. Я всегда сопротивлялся проникновению этого в те области, которые на самом деле в нем не нуждаются. Я действительно компилирую время из-за необходимости сравнивать его меньше, потому что что в клиенте Metaverse нет встроенной «игры». Клиент Metaverse больше похож на 3D веб-браузер,вместоодинигра。всеизвернослонионииз Поведение Все Приходитьсобственный сервер。я Можетсуществовать Реальностьчасмирсерединаредактироватьяизмиризчасть。есличто-нибудьизцвет、Поведениеили Модель нужно изменить,Что Нетнуждаться客户端重новыйкомпилировать。 использовать C#и Unity Люди быстрее прогрессируют в решении одной и той же проблемы. Один ответ: Я не совсем верю AAA Уровень игры будет использовать Rust написать (можете сами вставить "потому" что Rust изиграэкология развитиясистеманезрелая”или“потому что AAA Разработка игр становится все более консервативной и не склонной к риску"), но мне любопытно, почему вы так думаете. C++ существовать 1985 Доступные до начала тысячелетия, существуют Quake 3 извлечённый (получивший выгоду от C++98 из Новых возможностей), он стал популярен во время развития существования игры.

Сообществосередина Чтоонлюдиизсмотреть Закон,Вот выдержки из некоторых репрезентативных ответов

яихиспользовать Rust Написал несколько инструментов конвейера, в том числе CLI инструментисуществовать DCC используется в Python Инкапсуляция Руст, основные тезисы статьи соответствуют моему опыту. Когда языковые ограничения соответствуют вашим действиям, Rust Это отличный вариант выбора, но игровой движок часто кажется безопасным, но безопасность не доказана, а режим не очень совместим. Хотяяих Можетвокруг Проходитьэтотнекоторый限制并生产出хорошийизпродукт,существуют в некоторых случаях даже «лучшие» продукты,Но эти преимущества не соответствуют нашим болевым точкам. Мы не зарабатываем больше денег,Нет более быстрой итерации,Нет быстрее из доставки,Наши затраты на техническое обслуживание не сократились.,Мы просто сделали что-то «сложным путем».

ясуществоватьпытаться Проходитьвсе Популярностьиздвигательи Может多Нет太Популярностьиздвигательпосле,离выпускатьяиз Нет.одинигра Сравниватьлюбой предыдущийчас候Все更近Понятно。主хотетьпричинадапотому чтоя Можетиспользовать Программирование на Rust и любовь к этому языку, просто работа с ним дали мне мотивацию продолжать работу. Я понимаю его недостатки, но ваше предпочтение технологиям также является важным фактором сохранения мотивации. Я использую Bevy двигатель,Хотя это молодой двигатель,Но очень интересно.

яверноэтотвнутризакрывать В ECS я категорически не согласен с некоторыми утверждениями, но Я Думаю, я понимаю точку зрения автора. Автор "перфоманс" подвергся критике ECS, к сожалению, из-за того, что это часто рекламируется как принятие ECS из причин (поэтому многие ECS Библиотеки проектируются с учетом этого момента, что иногда приводит к API Очень больно). Во всяком случае, автор указывает, что часто пишут «если (player) ... else if (wall)”,Я думаю, это действительно подчеркивает, правда ECS из Недостаточное понимание - Мне кажется, что это легко могло бы быть кандидатом на рефакторинг в несколько системиз, но автор, похоже, застрял на одной: системверно должен быть один компонент по образу мышления. В любом случае, мне это действительно нравится Ржавчина, но существуют во многом согласен - Я Думаю, правильное написание кода и быстрое написание кода — это совершенно разные вещи, и Rust Сосредоточьтесь в основном на первом. Я ECS из Сильный сторонник, но признаю существование Rust В игре Развитие Сообщество не так много общения. Моя личная философия заключается в том, что компоненты должны быть разделены очень детально, а система — нет. Я думаю ECS верно, для меня самым большим преимуществом является естьсистема, склеивающая эти компоненты в логически осмысленную комбинацию. - у вас может быть Player компонент, а Enemy компонент и Health компоненты, но у вас могут быть PlayerHealth и EnemyHealth система。(потому чтоеслиты Только考虑иметь像...один PlayerSystem, один EnemySystem и HealthSystem Если у вас есть что-то подобное, я думаю, вы это потеряете. ECS из Несмотря на все преимущества, лучше придерживаться этого Unity Стиль из "раздутых компонентов", просто я думаю у тебя и существует Rust Ты так не умеешь...)

я Должен сказатьятакой же意。Я надеюсья Неттакой же意,потому что мне очень нравится им пользоваться Программирование на Rust, но (независимая) разработка игр – это прежде всего не программирование, а Rust Очень мешает этой работе.

этот归结длясистемапрограммированиеииграпрограммированиемеждуизразница。 большинстводвигательиспользовать C++ в качестве ядра и дополнительный «язык сценариев игры». существовать Unity , C# может выполнить, чем Lua или GDScript Больше работы. некоторые люди надеются Rust Умеют работать с «языком сценариев», но будут разочарованы. Ржавчина На самом деле это язык, ориентированный на крупномасштабные проекты. Я Думаю, ни один язык не может удовлетворить потребности каждого. У меня много подобных разочарований, и я должен сказать, что не нашел Rust верно Разработано игрой, я хочу из волшебной пули, но я, потому что что еще есть причины придерживаться этого. зрелый Rust Нужен движок и прочее для быстрого прототипирования, работа игрового дизайнера по интеграции (заполнение GDScript, Unreal Blueprints и другие вещи и персонажи). Сразуиндивидуальныйлюдии Слово,еслилюдиих Толькодуматьсуществовать底слойдвигательначальстворуководить大量Работа,я Рекомендуюих Толькососредоточиться на Rust Для развития игры.

также Можети Это не имеет ничего общего с,нокакодинвнешнийлюди Приходитьсмотреть,читатьприезжатьэтот Что?多自письмо地объяснять“Rust Ни в коем случае это не правильный инструмент для разработки игр из (имея в виду автора меню, это глупо из)" из прокомментировал, и тогда было так много тех, кто уверенно сказал "Rust Это абсолютно правильный инструмент для разработки (подразумевается, что автор просто не был достаточно умен, чтобы это сделать)", - прокомментировал это очень неловко.

этотвнутринестиприезжатьизвопросда否иметь в виду Rust Никогда не подходит для разработки игр? Я не совсем верю в это, потому что чтоихверно macroquad Есть положительные отзывы и по другим аспектам. Возможно, что более важно, я надеюсь, Rust существование становится лучше в этом, потому что что я вполне могу себе представить существование в будущем, реализовав в какой-то момент небольшую игру на моем любимом языке, и мне бы очень понравилось это делать.

Хм,даиз,этотда Rust аспектизвыбирать。C++ Просто позволяет вам это делать, и это работает до тех пор, пока не перестанет работать. Я думаю ECS Уже переоценен, Fyrox Сравнивать bevy Еще один шаг вперед, потому что Они избегают архитектурных рисков. В этом вопросе вы правы на сто процентов. но жизненный цикл и так далее, вот и существуют в ожидании краха из превентивных мер. Есть много историй о том, как в последнюю минуту что-то переделывали, чтобы что-то работало достаточно стабильно, чтобы его можно было отправить. Средство проверки заимствований не отбрасывает недействительный код, но отбрасывает код, валидность которого не может быть доказана. Это тонкое, но важное различие.

Я думаю https://crates.io/crates/qcell — отличное, но часто упускаемое из виду решение проблем с проверкой займов. Его главным преимуществом является возможность иметь долговременные ссылки на единицы измерения при краткосрочном изменяемом заимствовании многих из одних и тех же единиц. https://crates.io/crates/qcontext существует на этом фундаменте, чтобы обеспечить статический контент с нулевой внутренней изменчивостью.

закрывать В C++ Утверждение: «Оно дало вам верёвку и попросило повеситься на ней» является правильным, что является противоположной позицией. Вы можете делать с ним все, что захотите, но в какой-то момент это позволяет разработчикам беспокоиться и делать все, что они хотят. Чтобы принять риск, вы должны знать, когда можно обойти правила и даже как минимизировать риск. существовать Rust середина,если компилятор полностью обеспечивает соблюдение правил,У вас просто нет возможности сделать это. Поэтому бывают моменты, когда я чувствую, что правильность кода ставится выше мнения разработчиков.,Пусть у вас будет только одна выборка. Удалить верно Правильно или Что делать из Свободных выборов,Есть только один способ сделать что-то. Я родом из встроенного мира,Меня очень раздражает невозможность создавать аппаратные интерфейсы в качестве синглтонов. и,Вам нужно прыгать через различные обручи, чтобы создать синглтон.,Сравниватьнравитьсяиспользовать Библиотека,Это беспокоит меня еще больше.

Дополнительные комментарии см.:

  • Канал Reddit Rust[16]
  • Hacker News[17]

постскриптум

существоватьясмотреть Приходить,Это человек из "не гонится за качеством кода",Просто требуйте быстрых итераций,проверять Функцияизнезависимыйигра Разработка ВОЗ」верно Rust из жалоб. Но его жалобы всегда резонны, и он сказал, что существование имеет какие-то идеи. Может быть, он действительно «наступил на существование». Rust Язык вне границ приложения.

верно ВЧтонекоторыйдуматьхотеть快速Подтверждайте идеи,И его необходимо быстро изменить на основе отзывов бизнеса и пользователей/игроков.,И одноразовые из продуктов проекта не требуют обслуживания,также Можетиспользовать Rust Это действительно неуместно。этотиндивидуальныймир并Нетдавсеэлементглаз Всенуждаться严格изсилаиз Безопасностьикодкачество。

Спасибо за чтение.

Ссылки

[1]

《3 лет полный рабочий день Rust игра После разработки «Извлеченных уроков», Также Почему мы должны сдаваться? Rust》: https://loglog.games/blog/leaving-rust-gamedev/

[2]

darthdeus/comfy: https://github.com/darthdeus/comfy

[3]

《Unrelaxing Quacks》: https://store.steampowered.com/app/2331980/Unrelaxing_Quacks/

[4]

BITGUN: https://store.steampowered.com/app/1673940/BITGUN/

[5]

World::reserve in hecs: https://docs.rs/hecs/latest/hecs/struct.World.html#method.reserve_entity

[6]

get2_mut in thunderdome: https://docs.rs/thunderdome/latest/thunderdome/struct.Arena.html#method.get2_mut

[7]

«Overwatch» от Blizzard используется. ECS Архитектура: https://johnyoung404.github.io/2019/06/27/ECS%E6%9E%B6%E6%9E%84%E7%AE%80%E4%BB%8B/

[8]

rerun: https://www.rerun.io

[9]

иградизайнизвидео: https://www.youtube.com/watch?v=o5K0uqhxgsE

[10]

Отражение времени компиляции: https://soasis.org/posts/a-mirror-for-rust-a-plan-for-generic-compile-time-introspection-in-rust/

[11]

Tomorrow Corporation Tech Demo: https://www.youtube.com/watch?v=72y2EC5fkcE

[12]

hot-lib-reloader-rs: https://github.com/rksm/hot-lib-reloader-rs

[13]

yazi: https://github.com/sxyazi/yazi

[14]

JoshTriplett: https://www.reddit.com/user/JoshTriplett/

[15]

видео: https://video.hardlimit.com/w/7usCE3v2RrWK6nuoSr4NHJ

[16]

Reddit Rust Канал: https://www.reddit.com/r/rust/comments/1cdqdsi/lessons_learned_after_3_years_of_fulltime_rust/

[17]

Hacker News: https://news.ycombinator.com/item?id=40172033

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose