Konstrukcja silnika gry oparta na komponentach [zamknięta]

Przyglądałem się projektowi silnika gry (skupionemu głównie na silnikach gier 2D, ale także na grach 3d) i jestem zainteresowany kilkoma informacjami na temat tego, jak to zrobić. Słyszałem, że wiele silników obecnie przechodzi na konstrukcję opartą na komponentach, a nie na tradycyjnej hierarchii głębokich obiektów.

Czy znasz jakieś dobre linki z informacjami o tym, jak tego typu projekty są często realizowane? Widziałem ewoluować swoją hierarchię , ale naprawdę nie mogę znajdź wiele więcej szczegółowych informacji (większość z nich po prostu wydaje się mówić "używaj komponentów, a nie hierarchii", ale odkryłem, że potrzeba trochę wysiłku, aby przełączyć moje myślenie między dwoma modelami).

Wszelkie dobre linki lub informacje na ten temat byłyby mile widziane, a nawet książki, chociaż linki i szczegółowe odpowiedzi tutaj byłyby preferowane.

Author: Terrance, 2009-12-14

8 answers

Aktualizacja 2013-01-07: jeśli chcesz zobaczyć dobre połączenie silnika gry opartego na komponentach z (moim zdaniem) doskonałym podejściem do programowania reaktywnego, spójrz na silnik V-Play. Bardzo dobrze integruje funkcje QTS QML property binding.

Przeprowadziliśmy kilka badań na temat CBSE w grach na naszej uczelni i zebrałem trochę materiału na przestrzeni lat: {]}

CBSE w literaturze gier:

  • Silnik Gry Architektura
  • Game Programming Gems 4: A System for Managin Game Entities Game
  • Perełki Programowania Gier 5: Zarządzanie Obiektami W Oparciu O Komponenty
  • [[15]}Perełki Programowania Gier 5: Biblioteka Komponentów Generycznych
  • Game Programming Gems 6: Game Object Component System
  • Tworzenie Gier Zorientowanych Obiektowo
  • Architektur des Kerns einer Game-Engine und Implementierung mit Java (Niemiecki)

Bardzo dobry i czysty przykład komponentu game-engine w C# to Framework do gry Elephant .

Jeśli naprawdę chcesz wiedzieć, jakie komponenty są czytane: Inżynieria oprogramowania oparta na komponentach! Definiują element jako:

A komponent oprogramowania jest elementem oprogramowania, który jest zgodny z modelem komponentu i może być niezależnie wdrożony i złożony bez modyfikacji zgodnie ze standardem kompozycji.

A Model składowy definiuje specyficzną interakcję i standardy składu. Implementacja modelu komponentu jest dedykowanym zestawem wykonywalnych elementów oprogramowania wymaganych do obsługi wykonywania komponentów zgodnych z modelem.

A software component infrastructure jest zbiorem współdziałających ze sobą komponentów oprogramowania zaprojektowanych w celu zapewnienia, że system lub podsystem oprogramowania zbudowany przy użyciu tych komponentów i interfejsów spełnia jasno określone specyfikacje wydajności.

Moje opinie po 2 latach doświadczenia z CBSE w grach, uznaliśmy, że programowanie obiektowe jest po prostu ślepym zaułkiem. Pamiętaj o moim ostrzeżeniu, gdy obserwujesz, jak twoje komponenty stają się coraz mniejsze, a bardziej przypominają funkcje zapakowane w komponenty z wieloma bezużytecznymi kosztami. Zamiast tego użyj programowania funkcyjno-reaktywnego . Zajrzyj też do mojego świeżego posta na blogu (który doprowadził mnie do tego pytania podczas pisania:)) o dlaczego przełączyłem się z architektury silnika gry opartej na komponentach do FRP.

CBSE w gazetach o grach:

CBSE w grach-linki (posortowane według trafności):

 316
Author: Gerold Meisinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:07

Wydaje się, że brakuje informacji na ten temat. Niedawno wdrożyłem ten system i znalazłem naprawdę dobry GDC Powerpoint, który wyjaśniał szczegóły, które często są pozostawiane dość dobrze. Ten dokument jest tutaj: Teoria i praktyka architektury obiektu gry

Oprócz tego Powerpoint, są kilka dobrych zasobów i różne blogi . PurplePwny ma dobrą dyskusję i linki do innych zasobów. Ugly Baby Studio ma trochę dyskusji wokół idei, jak komponenty współdziałają ze sobą. Powodzenia!

 9
Author: Noah Callaway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-01 15:01:21

Chociaż nie jest to kompletny samouczek na temat projektowania silnika gry, odkryłem, że ta strona zawiera kilka dobrych szczegółów i przykładów wykorzystania architektury komponentów do gier.

 7
Author: a_m0d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-12 23:56:50

Jest open-source i dostępny pod adresem http://codeplex.com/elephant

Ktoś stworzył działający przykład kodu gpg6, można go znaleźć tutaj: http://www.unseen-academy.de/componentSystem.html

Lub tutaj: http://www.mcshaffry.com/GameCode/thread.php?threadid=732

Pozdrawiam

 5
Author: RubyDeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-12 23:58:50

Aktualnie badam ten dokładny temat w wielu (wielu) wątkach na GameDev.net i znalazłem następujące dwa rozwiązania jako dobrych kandydatów na to, co będę rozwijać dla mojej gry:

 4
Author: pek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-17 12:39:09

Zbadałem i wdrożyłem ten ostatni semestr na Kurs tworzenia gier. Mam nadzieję, że ten przykładowy kod może wskazać ci właściwy kierunek, w jaki możesz podejść do tego.

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

Komponenty określają zachowanie i operują na właściwościach. Właściwości są współdzielone między wszystkimi komponentami przez odniesienie i uzyskaj aktualizacje za darmo. Oznacza to brak dużych kosztów na przesyłanie wiadomości. Jeśli będą jakieś pytania, postaram się odpowiedzieć najlepiej jak potrafię.

 4
Author: Macuzza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-05 23:08:05

W tym kontekście komponenty dla mnie brzmią jak izolowane części uruchomieniowe silnika, które mogą działać jednocześnie z innymi komponentami. Jeśli to jest motywacja, to warto przyjrzeć się modelowi aktora i systemom, które z niego korzystają.

 1
Author: Hassan Syed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-14 14:41:17

Ciekawy artcle...

Szybko polowałem na google i nic nie znalazłem, ale może chcesz sprawdzić niektóre komentarze - Wiele osób zdaje się mieć okazję zaimplementować proste demo komponentu, możesz rzucić okiem na niektóre z nich w poszukiwaniu inspiracji:

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

Również same komentarze wydają się mieć dość dogłębną dyskusję na temat tego, jak można zakodować taki system.

 1
Author: Justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-14 14:53:32