joggel hat geschrieben:Ich finde ein KlassenDiagramm da auch immer sehr aussagekräftig :)
Schrompf hat geschrieben:Ich wundere mich aber, ob ich das überlesen habe: hast Du eine Möglichkeit vorgesehen, Objekte zu gruppieren? [...]
Sehr gute Frage, denn die Antwort macht wohl den Aufgabenbereich des gesamten Systems sehr viel klarer: Meine Einführung über die Entwicklung des Systems aus dem Szenengraphen heraus war in dieser Beziehung leider etwas missverständlich. Tatsächlich enthält das beschriebene abstrakte System einen solchen Szenengraphen in keinster Weise, denn über die Beziehungen von Objekten untereinander enthält es keinerlei Information.
Auch hier greift die Trennung einzelner Subsysteme: Betrachten wir wieder das Beispiel des Instancing, so ist eine Gruppierung gleichartiger Meshes unter dem Aspekt des Renderings sehr sinnvoll, in der physikalischen Repräsentation der Welt dagegen wäre eine derartige Hierarchie ohne jeglichen Vorteil für die Simulation, schlimmer, unnötiger Balast bei der Verarbeitung. Aufgabenbezogene Szenengraphen finden sich also frühestens in der Ebene der
SceneControllers, welche an einer bestimmten Simulation hängen. Dortige Struktur und Gruppierung wird durch das beschriebene System in keinster Weise beschränkt oder vorgegeben.
Neben dem Simulationssystem existiert, wie im letzten Post angedeutet, auch noch eine Welt (welche dem entspräche, was man in einem Editor bzgl. Szenenobjekten sähe und bearbeitete). Diese enthält momentan einfach alle existierenden Objekte in einer linearen Liste, Hierarchien zur Objektgruppierung ließen sich hier jedoch ohne weiteres implementieren. Von echten Transformationshierarchien (abseits der Editierlogik) bin ich persönlichen kein Fan, weil sie den Code zur Laufzeit unnötig verkomplizieren, und in Bezug auf Verhalten bereits vollständig durch die Physiksimulation abgedeckt sind (für korrektes physikalisches Verhalten entstünde gar eine Dopplung derselben Funktionalität in gänzlich verschiedenen Codeabschnitten).
Schrompf hat geschrieben: Das, was ich bisher von komponentenbasierender Programmierung gesehen habe, lief immer darauf hinaus, dass man unendlich viele Versionen von "Suche mir alle Komponenten des Typs xy raus und mach was damit" schrieb.
Ja, nichts hasse ich mehr als diese pseudogenerischen Architekturen, die um der Generizität willen alles in einen Topf werfen, nur um es anschließend mit viel Mühe wieder herauszufischen. Abgesehen von oberflächlicher Entkopplung, welche in der Regel wohl vor allem ein Workaround um das verfehlte Modulkonzept der jeweiligen Programmiersprache ist, gewinnt man in meinen Augen nicht viel. Dafür nimmt man, wie du schon sagtest, eine massive Unsicherheitsquelle, einen unnötigen (Such-)Laufzeitverlust und extrem viel umständlicheren Code in Kauf.
Mein System ist, wie schon angedeutet, extrem direkt. Wie schon einmal erwähnt, habe ich mich in vielerlei Hinsicht von tiefer Kapselung gelöst. Die Verbindung verschiedener Controllers geht nicht den Umweg über Entities oder gar Simulationen, keinen Umweg über Typsuchfunktionen. Viel schlichter werden einfach direkt Instanzen zusammenarbeitender Objekte verknüpft. Der
MeshController erhält schon bei der Konstruktion sein Entity, seinen (Rendering-)
SceneController, sein
Mesh, seinen
EffectCache etc. unverschleiert per Argument, alle zur Laufzeit benötigten Objekte landen in Form von Zeigern im
MeshController-Objekt.
Dies hat die offensichtliche Konsequenz, dass neben der Simulation auch die verschiedenen Rendering-, Physik-, Character- etc.
SceneControllers durch die Anwendung gespeichert werden müssen. Dies geschieht in der Regel in einer durch die Anwendung hart-codierten Szenenstruktur, die Zeiger auf alle für die Anwendung relevanten Simulations-Controllers bereit hält. Eine naheliegende Reaktion wäre jetzt: Aber was ist dann der Punkt dieser ganzen Architektur, die Controllers generisch an Simulationen anheftet, wenn ich diese Controllers selbst wieder hart-codiert speichern muss? Die Antwort: Das Controller-System automatisiert und steuert Verhalten, nicht Beziehungen. Eine Anwendung weiß immer, von welchen Subsystemen sie Gebrauch macht, ein Verstecken dieser wäre also absolut sinnlos.
Eine gewisse Ausnahme dieser Regeln stellen Tools in der Content-Pipeline da. Zwecks Serialisierung und Bearbeitung existiert tatsächlich ein minimales Reflection-System, angedeutet durch die
GetType()-Methoden im Klassendiagramm. Diese sind jedoch ausdrücklich nicht für den normalen Gebrauch zur Anwendungslaufzeit gedacht, sondern allenfalls zur generischen Bearbeitung polymorpher Objekte in den entsprechenden Tools sowie zur generischen Serialisierung polymorpher Objekte durch das Serialisierungssystem.
Chromanoid hat geschrieben:Wie löst du technisch die Identifizierung von Controllern bzw. wird es möglich sein, dass ein Controller A eine Art Schnittstelle B als Controller entgegen nimmt um bestimmte Aufgaben zu delegieren/Aktionen auszulösen/Daten zu erhalten?
Ich denke das habe ich an dieser Stelle bereits ausreichend beschrieben, dennoch die direkte Antwort: Das Problem existiert nicht, ich übergebe bei der Konstruktion direkt Objekt B an Controller A.
Chromanoid hat geschrieben:Wird es möglich sein die zu benutzenden Controller eines Entities z.B. via XML zu konfigurieren?
Da die Serialisierung momentan in XML geschieht: Ja, im Rahmen der normalen Serialisierung eben. Konfiguration über einen entsprechenden Editor sollte aber wesentlich sicherer und einfacher sein, als im XML rumzuschmieren. ;)
Chromanoid hat geschrieben:In einem recht interessanten Entity-System für Java werden dazu in den Komponenten des Entity nur Daten gespeichert und Systeme übernehmen die Verarbeitung sozusagen von außen.
Bei mir gibt es gewissermaßen beides, die Controllers steuern in erster Linie das Verhalten, Daten werden von den Controllers i.d.R. nur referenziert oder bei Bedarf leicht ergänzt (z.B. Renderable Controllers durch Bounding Spheres und Renderable Flags). Beim Rendering existieren durchaus auch datenorientierte Ansätze, bei denen Subsysteme von Controllers mit Daten gefüttert werden, woraufhin diese Subsysteme den Daten entsprechend von außen die Steuerung der Controllers übernehmen.
Chromanoid hat geschrieben:In Unity wird das ganze ja so ähnlich wie bei dir gemacht (sofern ich es richtig verstanden habe). Dort kann man ja die Komponenten über den Typ erhalten.
Wenn Komponenten regulär über den Typ abgefragt werden, dann nein. Ich habe das Unity-System kurz überflogen, und es scheint mir eher ein besonders schwammiger Vertreter der gerade eben angesprochenen pseudogenerischen Waschbärarchitektur zu sein, korrigiere mich, wenn ich mich irre. ;)