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

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

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

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

Ответ 1

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

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

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

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

Очень хорошим и чистым примером игрового движка на основе компонентов на С# является игровая инфраструктура Elephant.

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

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

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

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

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

CBSE в играх:

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

Ответ 2

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

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

Ответ 3

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

Ответ 5

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

Ответ 6

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

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<class T> T& GetPropertyDataPtr(const std::string& propName);
    template<class T> 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<class T> void AddProperty(const std::string& propName);
    template<class T> Property<T>* GetProperty(const std::string& propName);
    template<class T> const Property<T>* GetProperty(const std::string& propName) const;

    unsigned int m_Id;
    std::map<const string, IProperty*> m_Properties;
    std::map<const string, Component*> m_Components;
};

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

Ответ 7

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

Ответ 8

Интересный артефакт...

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

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

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