Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: interne Funktionsweise eines Arrays

  Alt 21. Jul 2014, 10:33
Jedes Objekt in der Engine, was durch die KI gesteuert wird, erhält von der DLL eine eindeutige ID-Nummer (und damit den Index eines Arrays), um mit seinem Schwester-Objekt kommunizieren zu können. Und genau an dieser Stelle war ich mir unschlüssig, ob der ständige Zugriff über ein Array-Index u.U. zu langsam ist. Wobei 'langsam' natürlich relativ ist.

Zudem kommt noch, daß es je nach Spiel bzw. Gameplay vorkommen kann, daß KI-Objekte in einem kurzen Turnus erstellt und wieder gelöscht werden. Und das bedeutet, daß es recht schnell Lücken innerhalb des Arrays geben kann, die man sich irgendwie merken muß, um diese mit später erzeugten KI-Objekten wieder befüllen zu können.
Den Index in einer Liste als ID zu verwenden ist eine schlechte Idee. Eine ID sollte wirklich nur einmal eindeutig vergeben und nicht wiederverwendet werden.
Damit man das Objekt mit wenigen Zugriffen auf die Liste findet, kann man diese nach ID sortieren.

Um das zu umgehen, fielen mir einfach verkettete Listen ein, da man schnell Elemente entfernen und hinzufügen kann.
Von verketteten Listen besser die Finger lassen. Die Vorteile von TList/TObjectList (gekapseltes Array) überwiegen in der Regel.
Z.B. passt das Array der Elemente häufig in den Cache der CPU. Das Verschieben von Elementen innerhalb des Arrays beim Löschen einzelner Elemente spielt so für die Geschwindigkeit nur eine untergeordnete Rolle.
Bei verketteten Listen liegen die Elemente im Speicher verstreut, es müssen eventuell mehrere Speicherbänke in den Cache geladen werden (der hat aber nur eine begrenzte Kapazität). Da kann es auch viel eher zu Kollisionen kommen, wenn mehrere CPUs auf die selbe Speicherbank zugreifen.
Als Folge dann Wartezeiten bis sich die Cache der CPUs synchronisiert haben.

Gestern testete ich die Möglichkeit, mir von diversen Variablen in der DLL die Speicheradressen liefern zu lassen. Auf diese Weise konnte ich aus der 3D-Engine heraus den Speicherinhalt der DLL-Variablen direkt manipulieren (was dem Aktualisieren der Schwester-Objekte für Positon. Rotation, ... entsprechen würde).
Hier bietet es sich an den Objekten außerhalb der KI ein Interface zu verpassen.
Dieses kann dem KI-Objekt beim Erzeugen mitgegeben werden.
Das KI-Objekt hat so immer Zugriff auf die aktuellen Objektwerte.
  Mit Zitat antworten Zitat