Ich schreibe die Spiel-Engine, die aus wenigen Modulen besteht. Zwei davon sind die Grafik-Engine und die Physik-Engine .
Ich frage mich, ob es eine gute Lösung ist, Daten zwischen ihnen auszutauschen.
Zwei Möglichkeiten (Teilen oder nicht) sehen so aus:
Ohne Daten zu teilen
GraphicsModel{
//some common for graphics and physics data like position
//some only graphic data
//like textures and detailed model's verticles that physics doesn't need
};
PhysicsModel{
//some common for graphics and physics data like position
//some only physics data
//usually my physics data contains A LOT more informations than graphics data
}
engine3D->createModel3D(...);
physicsEngine->createModel3D(...);
//connect graphics and physics data
//e.g. update graphics model's position when physics model's position will change
Ich sehe zwei Hauptprobleme:
- Viele redundante Daten (wie zwei Positionen für Physik- und Grafikdaten)
- Problem beim Aktualisieren von Daten (Ich muss Grafikdaten manuell aktualisieren, wenn sich die Physikdaten ändern)
Mit Daten teilen
Model{
//some common for graphics and physics data like position
};
GraphicModel : public Model{
//some only graphics data
//like textures and detailed model's verticles that physics doesn't need
};
PhysicsModel : public Model{
//some only physics data
//usually my physics data contains A LOT more informations than graphics data
}
model = engine3D->createModel3D(...);
physicsEngine->assingModel3D(&model); //will cast to
//PhysicsModel for it's purposes??
//when physics changes anything (like position) in model
//(which it treats like PhysicsModel), the position for graphics data
//will change as well (because it's the same model)
Probleme hier:
- physicsEngine kann keine neuen Objekte erstellen, sondern nur vorhandene Objekte aus engine3D "bewerten" (irgendwie sieht es für mich anti-unabhängiger aus)
- Daten in assingModel3D-Funktion umwandeln
- PhysicsEngine und GraphicsEngine müssen vorsichtig sein - sie können keine Daten löschen, wenn sie sie nicht benötigen (weil der zweite sie möglicherweise benötigt). Aber es ist eine seltene Situation. Außerdem können sie nur den Zeiger löschen, nicht das Objekt. Oder wir können davon ausgehen, dass GraphicsEngine Objekte löscht, PhysicsEngine zeigt nur darauf.
Welcher Weg ist besser?
Was wird in Zukunft mehr Probleme verursachen?
Ich mag die zweite Lösung mehr, aber ich frage mich, warum die meisten Grafik- und Physik-Engines die erste bevorzugen (vielleicht, weil sie normalerweise nur Grafiken oder nur Physik-Engines erstellen und jemand anderes sie im Spiel verbindet?).
Haben sie noch mehr versteckte Vor- und Nachteile?