Die C ++ - Engine, an der ich gerade arbeite, ist in mehrere große Threads unterteilt: Generieren (zum Erstellen meiner prozeduralen Inhalte), Spielen (für KI, Skripte, Simulationen), Physik und Rendern.
Die Threads kommunizieren miteinander über kleine Nachrichtenobjekte, die von Thread zu Thread weitergeleitet werden. Vor dem Ausführen eines Schritts verarbeitet ein Thread alle eingehenden Nachrichten - Aktualisierungen, um Objekte zu transformieren, hinzuzufügen und zu entfernen usw. Manchmal erstellt ein Thread (Generation) etwas (Art) und übergibt es einem anderen Thread (Rendering) für dauerhaften Besitz.
Früh im Prozess und ich habe ein paar Dinge bemerkt:
Das Nachrichtensystem ist umständlich. Das Erstellen eines neuen Nachrichtentyps umfasst das Unterklassen der Basis-Nachrichtenklasse, das Erstellen einer neuen Aufzählung für den Typ und das Schreiben einer Logik, wie die Threads den neuen Nachrichtentyp interpretieren sollen. Es ist ein Geschwindigkeitsschub für die Entwicklung und neigt zu Tippfehlern. (Nebenbemerkung: Wenn ich daran arbeite, schätze ich, wie großartig dynamische Sprachen sein können!)
Gibt es einen besseren Weg, dies zu tun? Sollte ich so etwas wie boost :: bind verwenden, um dies automatisch zu machen? Ich mache mir Sorgen, dass ich dadurch die Fähigkeit verliere, Nachrichten nach Typ oder etwas anderem zu sortieren. Ich bin mir nicht sicher, ob diese Art von Management überhaupt notwendig wird.
Der erste Punkt ist wichtig, weil diese Threads so viel kommunizieren. Das Erstellen und Weitergeben von Nachrichten ist ein wichtiger Bestandteil der Umsetzung. Ich möchte dieses System rationalisieren, bin aber auch offen für andere Paradigmen, die genauso hilfreich sein könnten. Gibt es verschiedene Multithread-Designs, über die ich nachdenken sollte, um dies zu vereinfachen?
Beispielsweise gibt es einige Ressourcen, die selten geschrieben, aber häufig aus mehreren Threads gelesen werden. Sollte ich offen sein für die Idee, gemeinsame Daten, die durch Mutexe geschützt sind, für alle Threads zugänglich zu machen?
Es ist das erste Mal, dass ich etwas entwerfe, das Multithreading von Grund auf berücksichtigt. In diesem frühen Stadium denke ich, dass es wirklich gut läuft (wenn man bedenkt), aber ich mache mir Sorgen um die Skalierung und meine eigene Effizienz bei der Implementierung neuer Dinge.