Hi, ich baue im Moment am RenderSystem meines 2D-Spiels (Tile-based) und habe folgende Situation:
Ich habe Physik- und Render-System voneinander getrennt und beide weitestgehend nach Data-oriented Design aufgebaut. Nun will ich das Render-System etwas modifizieren und jeder Render-Komponente (nahezu POD) eine Hand voll RenderNodes geben, wobei ein RenderNode aus einem VertexArray und einer Reihe von Transformationen besteht. Beim Rendern erzeuge ich mir einen einfachen SceneGraph der die zu zeichnenden Nodes kennt.
Nun verändern (bewegen, drehen etc.) sich nicht alle Objekte gleichzeitig aber viele über die Zeit gesehen schon, so dass ich die Transformationen aktualisieren muss. Dazu habe ich überlegt, da die Physik auch weiterhin vom Render-System nichts wissen soll, dass jede Physics-Komponente (komplett POD) noch ein Dirty-Flag bekommt, wenn sich das Objekt z.B. bewegt hat. Dann kann das Render-System das Flag prüfen und ggf. die Transformationen neu berechnen.
Nun würde ich das ganze in der
render()-Methode des Render-Systems ansiedeln: Dort erzeuge ich den SceneGraph, kann mir dabei die zugehörige Physik-Komponente holen, mir das Dirty-Flag dort anschauen und aus der Position etc. (die ich in der Physik-Komponente habe) die neuen Transformationen berechnen. Anschließend setze ich das Dirty-Flag zurück. Auf diese Weise berechne ich Transformationen nur für zu zeichnende Objekte. Nebeneffekt: Prinzipiell funktioniert das Zeichnen mehrerer Szenen in einem Fenster (Splitscreen Camera
) bisher ganz gut und sollte es auch weiterhin tun, da für nicht disjunkte Bereiche die Transformationen auch nur einmal berechnet werden, da das Flag anschließend zurückgesetzt wird.
So, nun kommen wir zum eigentlichen Problem Da das Render-System (bisher) nichts von den Physik-Komponenten geändert hat (wie gesagt: das Dirty-Flag ist noch nicht implementiert), hat das Render-System auf Physik-Komponenten nur Zugriff via
PhysicsData const &, so dass ich das Dirty-Flag so nicht zurücksetzen kann. Allerdings kann ich mich im Moment noch nicht dazu durchringen dem Render-System nicht-const-Access auf das Physik-System zu geben .. nur für den einen Fall die Garantie aufzugeben, dass das Render-System nicht versehentlich das Physik-System beeinflussen kann, gefällt mir noch nicht so
Ich habe mir in diesem Kontext mal angesehen was das
volatile-Schlüsselwort macht und festgestellt, dass ich es hier besser nicht verwenden sollte
(Irgendwie hatte ich das mal irgendwo gesehen, wo jmd. eine const Variable trotzdem ändern wollte
). Afaik kann der Wert dann nicht mehr gecachet werden und muss immer aus dem RAM geladen werden
Also genau das falsche für mich
Habt ihr eine Idee was ich machen kann um meine nicht-const-Ängste für diesen Fall abzubauen?
Oder kennt jmd. eine Alternative? Die einzige Alternative die mir einfällt wäre schon Ketzerei:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
struct PhysicsData {
// ...
bool dirty_flag;
void clearDirtyFlag() const { dirty_flag = false; } // <-- müsste gehen aber ist alles andere als elegant
}
|
LG Glocke