Hallo liebe Leute!
Ich lese schon einige Jahre hier mit und kam eigentlich nie wirklich dazu etwas zu erfragen, weil sich durch einiges stöbern praktisch alles klären lässt.
Jetzt hab ich mich hinreißen lassen ein kleines Spiel zu programmieren, das zu einem gewissen Teil auf einer PhysicEngine (nur Feder-Masse-Dämpfung) aufbauen soll.
Die Engine selbst hab ich schön objektorientiert aufgebaut und funktioniert auch ungefähr so, wie ich es mir erwartet habe.
Nur zu langsam um ein ganzes Spiel darauf basieren zu lassen. Selbst wenn es nur 2D ist.
Jetzt möchte ich sie umbauen und mich um die Daten selbst kümmern - möglichst ohne Flexibilität zu verlieren.
Die Daten liegen dann etwa in der Form im Speicher:
Delphi-Quellcode:
x,y,z: array of double;
//alle Werte mit dem gleichen Index gehören zu einem Objekt
Soweit, so gut. Auch Löschen ist zuerst einmal kein Problem, weil die Reihenfolge in der ich durchiteriere, eigentlich egal ist.
Ich möchte aber, dass sich mehrere Objekte Koordinaten teilen können.
Eine Feder muss die Koordinaten einer Masse lesen können, um die Kräfte berechnen zu können.
Außerdem brauche ich eine Liste von Kräften, die an einer Masse angreifen (Schwerkraft, verschiedene Federn,...).
Ich hab also haufenweise Querverweise.
Und genau da wird das Löschen von Elementen zu einem riesigen Problem:
Lösche ich irgendwelche Koordinaten aus dem Array, zeigen alle auf Koordinaten nach diesen zeigende Elemente auf einen falschen Index.
Ich würde es gerne vermeiden, alle Pointer zu kontrollieren, ob sie angepasst werden müssen.
Statt einfachem Löschen und Neuaufbauen aller Arrays würde ich so oder so einfach das zu löschende Element durch das letzte ersetzen. Dann zeigen auch praktisch alle Pointer auf die richtige Stelle im Array.
Aber die Pointer, die vorhin auf das letzte Element gezeigt haben, müssen geändert werden... und möglicherweise noch existierende Pointer auf das gelöschte Element müssen auch entfernt werden.
Das Problem mit dem letzten Element würde ich mit einem Referenzzähler und einer "Nachsendeadresse", einem Pointer auf die neue Position lösen. Wenn die Nachsendeadresse <> nil ist, werden die Pointer aktualisiert und der Referenzzähler dekrementiert. Ist der Zähler bei 0, wird das Element gelöscht oder als gelöscht markiert.
Ich weiß nur nicht, wie ich die Pointer die noch auf das gelöscht Element zeigen, entfernen kann?!
Denke ich da überhaupt zu umständlich und gibt einen einfach Weg für die ganze Geschichte?
Oder bin ich überhaupt komplett auf dem Holzweg?
Ich wäre für so ziemlich jede Anregung dankbar!
(P.S:
Natürlich hab ich auch Listen ausprobiert. Aber die scheinen doch DEUTLICH langsamer als Arrays zu sein