Design de motor de jogo baseado em componentes

Tenho estado a olhar para o design de motor de jogos (especificamente focado em motores de jogos 2D, mas também aplicável a jogos 3D), e estou interessado em algumas informações sobre como fazê-lo. Ouvi dizer que hoje em dia muitos mecanismos estão se movendo para um design baseado em componentes, em vez da tradicional hierarquia de objects profundos.

Você conhece algum bom elo com informações sobre como esses tipos de projetos são frequentemente implementados? Eu tenho visto evoluir sua hierarquia , mas eu realmente não consigo encontrar muitos mais com informações detalhadas (a maioria deles parece dizer “use componentes ao invés de uma hierarquia”, mas eu descobri que é preciso um pouco de esforço para mudar meu pensamento entre os dois modelos).

Quaisquer bons links ou informações sobre isso seriam apreciados, e até livros, embora links e respostas detalhadas aqui fossem preferidos.

    Atualização 2013-01-07 : Se você quiser ver uma boa combinação de mecanismo de jogo baseado em componentes com a (na minha opinião) abordagem superior de programação reativa, dê uma olhada no motor V-Play . Ele integra muito bem a funcionalidade de binding de propriedades do QML QTs.

    Fizemos algumas pesquisas sobre a CBSE em jogos na nossa universidade e coletei alguns materiais ao longo dos anos:

    CBSE na literatura de jogos:

    • Arquitetura do Game Engine
    • Game Programming Gems 4: Um sistema para o jogo Managin Game Entities
    • Game Programming Gems 5: Gerenciamento de Objetos Baseado em Componentes
    • Game Programming Gems 5: Uma biblioteca genérica de componentes
    • Game Programming Gems 6: Sistema de Componentes de Objetos de Jogo
    • Desenvolvimento de Jogos Orientados a Objetos
    • Architektur des Kerns einer Game-Engine e Implementação com Java (alemão)

    Um exemplo muito bom e limpo de um mecanismo de jogo baseado em componentes em C # é o framework do jogo Elephant .

    Se você realmente quer saber quais componentes são lidos: Engenharia de Software baseada em componentes! Eles definem um componente como:

    Um componente de software é um elemento de software que está em conformidade com um modelo de componente e pode ser implementado e composto de forma independente, sem modificação, de acordo com um padrão de composição.

    Um modelo de componente define padrões específicos de interação e composição. Uma implementação de modelo de componente é o conjunto dedicado de elementos executáveis ​​de software necessários para suportar a execução de componentes que estão em conformidade com o modelo.

    Uma infraestrutura de componente de software é um conjunto de componentes de software interativos projetados para garantir que um sistema de software ou subsistema construído usando esses componentes e interfaces satisfaçam as especificações de desempenho claramente definidas.

    Minhas opiniões após 2 anos de experiência com a CBSE no pensamento de games são que a programação orientada a objects é simplesmente um beco sem saída. Lembre-se do meu aviso enquanto observa seus componentes se tornarem menores e menores, e mais funções embaladas em componentes com muita sobrecarga inútil. Use programação reativa funcional em vez disso. Também dê uma olhada na minha nova postagem no blog (que me levou a essa pergunta enquanto escrevo :)) Por que eu mudei de arquitetura de mecanismo de jogo baseado em componentes para FRP .

    CBSE em papéis de jogos:

    • Desenvolvimento de jogos baseados em componentes – uma solução para escalonamento de custos e prazos de expansão?
    • Uma arquitetura flexível e expansível para jogos de computador (404)
    • Uma arquitetura de software para jogos
    • Uma estrutura genérica para desenvolvimento de jogos (WebArchive)
    • Composição Inteligente De Objetos De Jogo Usando Injeção De Dependência

    CBSE nos links da web de jogos (classificados por relevância):

    • Objetos baseados em componentes Wiki (wiki vazio)
    • Evolua sua hierarquia
    • Estrutura do Objeto de Jogo: Herança vs. Agregação
    • Um sistema de objects de jogo baseado em dados (PDF)
    • Um sistema de objects de jogo baseado em dados (PPT)
    • Ferramenta de prototipagem baseada em componentes para flash
    • Teoria e Prática da Arquitetura de Componente de Objeto de Jogo (404)
    • Sistemas de entidades são o futuro dos MMOs
    • ogre3d.org forum: Objetos Baseados em Componentes
    • gamedev.net: Arquitetura do sistema de entidades baseadas em componentes externos
    • gamedev.net: questão do Entity System
    • Blog do sistema de entidade Brainfold (WebArchive)

    Parece haver uma falta de informação sobre o assunto. Eu recentemente implementei este sistema, e eu encontrei um GDC Powerpoint realmente bom que explicava os detalhes que muitas vezes são deixados para trás muito bem. Esse documento está aqui: Teoria e Prática da Arquitetura de Componentes de Objetos de Jogo

    Além desse Powerpoint, existem alguns bons resources e vários blogs . PurplePwny tem uma boa discussão e links para alguns outros resources. Ugly Baby Studios tem um pouco de discussão sobre a ideia de como os componentes interagem uns com os outros. Boa sorte!

    Embora não seja um tutorial completo sobre o tema do design de mecanismos de jogos, descobri que esta página tem alguns bons detalhes e exemplos sobre o uso da arquitetura de componentes para jogos.

    É de código aberto e está disponível em http://codeplex.com/elephant

    Alguém fez um exemplo prático do código gpg6, você pode encontrá-lo aqui: http://www.unseen-academy.de/componentSystem.html

    ou aqui: http://www.mcshaffry.com/GameCode/thread.php?threadid=732

    Saudações

    Atualmente, estou pesquisando este tópico exato nos muitos tópicos (MANY) da GameDev.net e descobri que as duas soluções a seguir são boas candidatas para o desenvolvimento do meu jogo:

    • Critique meu sistema de entidades baseado em componentes
    • Arquitetura do sistema de entidades baseadas em componentes externos -> proposta de Lord_Evil

    Eu pesquisei e implementei este semestre para um curso de desenvolvimento de jogos. Espero que este código de amostra possa apontar você na direção certa de como você pode abordar isso.

    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; }; 

    Componentes especificam o comportamento e operam em propriedades. As propriedades são compartilhadas entre todos os componentes por uma referência e recebem atualizações gratuitas. Isso significa que não há sobrecarga grande para a passagem de mensagens. Se houver alguma dúvida, tentarei responder da melhor maneira possível.

    Neste contexto, os componentes para mim soam como partes de tempo de execução isoladas de um mecanismo que podem ser executadas simultaneamente com outros componentes. Se esta é a motivação, então você pode querer olhar para o modelo de ator e sistemas que fazem uso dele.

    Arte interessante …

    Eu tive uma rápida caçada no Google e não encontrei nada, mas você pode querer verificar alguns dos comentários – muitas pessoas parecem ter tido a oportunidade de implementar uma demonstração de componentes simples, você pode querer dar uma olhada em alguns deles para inspiração:

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

    Além disso, os comentários em si parecem ter uma discussão bastante aprofundada sobre como você pode codificar esse sistema.