Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Krane

Treue Seele

  • »Krane« ist der Autor dieses Themas

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

1

04.06.2015, 12:19

RenderSystem als Singleton in Entity-Component-System

Ich arbeite zur Zeit an einem etwas größeren Spiel.
Da es viele verschiedene Objekte im Spiel geben wird schrieb ich ein Entity-Component-System welches sich um die Objekte im Spiel kümmern soll.
Das Rendering wird von einer Klasse namens RenderSystem übernommen welche ein Singleton ist.
Die RenderComponents werden folgender Weiße im RenderSystem registriert:

C-/C++-Quelltext

1
2
3
4
5
6
Player::Player() : Entity("Player")
{
    staticSpriteRenderer = std::shared_ptr<Component>(new StaticSpriteRenderer("Data/link.png"));
    RenderSystem::Instance()->Register(staticSpriteRenderer);
    AddComponent(staticSpriteRenderer);
}


In der Register Funktion des RenderSystems wird nur die Komponente in einen std::vector eingetragen, der beim Rendern durch alle eingetragenen Komponenten iteriert und sie der Reihe nach rendert.

Ich weiß, dass Singletons eher unbeliebt in der Softwareentwicklung sind.
Gibt es denn irgendwelche Nachteile einer solchen Implementierung?
Falls ja, wie würdet ihr dieses Problem lösen?

Danke im Voraus!

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

04.06.2015, 12:43

Nachteile gibt es die gleichen, die man sonst auch immer bei Singletons hat.
  • Starke Abhängigkeiten
    • Eingeschränkte Testbarkeit
    • Eingeschränkte Austauschbarkeit
  • Versteckte Abhängigkeiten (Anhand der Schnittstelle ist nicht ersichtlich, was weiterhin benötigt wird)
  • ...
Wie man es besser machen kann:
Man erzeugt sich einfach nur eine einzige Instanz, bspw. innerhalb der "Game"- oder "EngineGame"-Klasse und erzeugt die (Static)SpriteRenderer-Instanzen nur an einer zentralen Stelle, bspw. an der Stelle, an der die Szenen/Level geladen werden. (Dort ist das RenderSystem bekannt und erzeugte Instanzen können diesem bekannt gemacht werden.)
Alternativ könnten bei jedem Render-Aufruf alle SpriteRenderer-Instanzen gesucht werden, nur dürfte das langsamer sein.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Krane

Treue Seele

  • »Krane« ist der Autor dieses Themas

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

3

04.06.2015, 13:12

Ok, danke schonmal.
Du meinst ich soll die RenderComponent (StaticSpriteRenderer) nicht im Konstruktor des Players, sondern im Konstruktor der Szene erzeugen?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

4

04.06.2015, 13:33

Nein, diese Komponenten sollten da erzeugt werden, wo auch die Szene und die Entities erzeugt werden. (Sie sollen aber nicht von den Entities selbst erzeugt werden.)

Weiterhin solltest du "Composition over Inharitance" berücksichtigen. Der einzige Unterschied, den ich derzeitig beim Player zur Entity sehen kann, ist eine andere Komponentenzusammensetzung. Diese kann auch von außerhalb erreicht werden, sodass eine Spezialisierung der Entity-Klasse nicht notwendig sein sollte.
Zukünftig wird der Unterschied wahrscheinlich das Verhalten sein. Andere Systeme sehen dies als separaten Komponententypen vor, von dem entsprechende Klassen (bzw. "Skripte") abgeleitet sein können. (Man könnte auch darüber nachdenken, ob diese Skripte ggf. in anderen Sprachen geschrieben sein könnten, bspw. Lua, JavaScript, Python, PHP, ...)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Krane

Treue Seele

  • »Krane« ist der Autor dieses Themas

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

5

04.06.2015, 13:57

Danke Sacaldur!
Auf diesem Weg lassen sich sicher auch viele zukünftige Probleme vermeiden.
Zur Zeit hibt es noch keinen Unterschied zwischen Player und Entity, jedoch habe ich vor die Logik vorerst in die Player Klasse zu schreiben.
Später, wenn ich die Skriptkomponente implementiert habe, werde ich auf ein data-driven-system umsteigen in dem die Entities durch .xml Dateien erstellt werden.

Werbeanzeige