Компонентный дизайн игрового движка

Я смотрел дизайн игрового движка (специально ориентированный на 2d игровые движки, но также применимый к 3D-играм), и я заинтересован в некоторой информации о том, как это сделать. Я слышал, что многие двигатели в настоящее время переходят на компонентный дизайн, а не на традиционную иерархию глубоких объектов.

Знаете ли вы о каких-либо хороших связях с информацией о том, как часто реализуются подобные проекты? Я видел, как развивается ваша иерархия , но я не могу найти много больше с подробной информацией (большинство из них просто говорят «использовать компоненты, а не иерархию», но я обнаружил, что требуется немного усилий, чтобы переключить мое мышление между двумя моделями).

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

Обновление 2013-01-07 : Если вы хотите увидеть хорошее сочетание игрового движка на основе компонентов с (на мой взгляд) превосходным подходом к реактивному программированию, взгляните на двигатель V-Play . Он очень хорошо интегрирует функциональные возможности привязки свойств QT QML .

Мы провели некоторое исследование по CBSE в играх в нашем университете, и за эти годы я собрал некоторые материалы:

CBSE в игровой литературе:

  • Архитектура игрового движка
  • Game Programming Gems 4: Система для игр Game Managin Game
  • Программирование игр Gems 5: Управление объектами на основе компонентов
  • Game Programming Gems 5: Библиотека общих компонентов
  • Игровое программирование Gems 6: Компонентная система игровых объектов
  • Объектно-ориентированная разработка игр
  • Architektur des Kerns einer Game-Engine und Implementierung mit Java (немецкий)

Очень хороший и чистый пример компонентного игрового движка в C # – это игровая среда Elephant .

Если вы действительно хотите знать, какие компоненты читаются: Компонентная программная инженерия! Они определяют компонент как:

Программный компонент представляет собой программный элемент, который соответствует модели компонентов и может быть независимо развернут и составлен без изменений в соответствии со стандартом композиции.

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

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

Мое мнение после двухлетнего опыта работы в CBSE в играх состояло в том, что объектно-ориентированное программирование просто тупиковое. Помните мое предупреждение, наблюдая, как ваши компоненты становятся все меньше и меньше, и больше похожи на функции, упакованные в компоненты с большим количеством бесполезных накладных расходов. Вместо этого используйте функционально-реактивное программирование . Также взгляните на мое новое сообщение в блоге (которое привело меня к этому вопросу при написании 🙂 🙂 о том, почему я переключился с компонентной архитектуры игрового движка на FRP .

CBSE в играх:

  • Разработка игр на основе компонентов – решение для увеличения затрат и расширения сроков?
  • Гибкая и расширяемая архитектура для компьютерных игр (404)
  • Архитектура программного обеспечения для игр
  • Общая структура разработки игр (WebArchive)
  • Интеллектуальный состав игровых объектов с использованием инъекции зависимостей

CBSE в веб-ссылках игр (отсортировано по релевантности):

  • Компонентные объекты Wiki (пустая вики)
  • Развивайте свой иератик
  • Структура игрового объекта: Наследование и агрегация
  • Система объектов игровой информации (PDF)
  • Система объектов игровой информации (PPT)
  • Инструмент для создания прототипов на основе компонентов для вспышки
  • Теория и практика архитектуры объектов игровых объектов (404)
  • Entity Systems – будущее ММО
  • Форум ogre3d.org: Объекты на основе компонентов
  • gamedev.net: Архитектура сущности на основе компонентов на основе компонентов
  • gamedev.net: вопрос системы сущностей
  • Блог системной системы Brainfold (WebArchive)

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

В дополнение к этой Powerpoint, есть некоторые хорошие ресурсы и различные блоги . PurplePwny имеет хорошее обсуждение и ссылки на некоторые другие ресурсы. Ugly Baby Studios немного обсуждает идею взаимодействия компонентов друг с другом. Удачи!

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

Он доступен с открытым исходным кодом и доступен по адресу http://codeplex.com/elephant

Кто-то сделал рабочий пример gpg6-кода, вы можете найти его здесь: http://www.unseen-academy.de/componentSystem.html

или здесь: http://www.mcshaffry.com/GameCode/thread.php?threadid=732

С уважением

В настоящее время я изучаю эту точную тему во многих (MANY) streamах на GameDev.net и нашел следующие два решения, чтобы быть хорошими кандидатами на то, что я буду развивать для своей игры:

  • Критика моей системы сущностей на основе компонентов
  • Архитектура сущности на основе компонентов на основе компонентов -> Предложение Lord_Evil

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

class Entity { public: Entity(const unsigned int id, const std::string& enttype); ~Entity(); //Component Interface const Component* GetComponent(const std::string& family) const; void SetComponent(Component* newComp); void RemoveComponent(const std::string& family); void ClearComponents(); //Property Interface bool HasProperty(const std::string& propName) const; template T& GetPropertyDataPtr(const std::string& propName); template const T& GetPropertyDataPtr(const std::string& propName) const; //Entity Interface const unsigned int GetID() const; void Update(float dt); private: void RemoveProperty(const std::string& propName); void ClearProperties(); template void AddProperty(const std::string& propName); template Property* GetProperty(const std::string& propName); template const Property* GetProperty(const std::string& propName) const; unsigned int m_Id; std::map m_Properties; std::map m_Components; }; 

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

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

Интересный арт …

У меня была быстрая охота на google и ничего не нашла, но вы можете проверить некоторые комментарии – многие люди, похоже, пошли на реализацию простой демонстрации компонентов, вы можете взглянуть на некоторые их для вдохновения:

http://www.unseen-academy.de/componentSystem.html
http://www.mcshaffry.com/GameCode/thread.php?threadid=732
http://www.codeplex.com/Wikipage?ProjectName=elephant

Кроме того, сами комментарии, похоже, содержат достаточно подробное обсуждение того, как вы можете кодировать такую ​​систему.

Давайте будем гением компьютера.