Einzelnen Beitrag anzeigen

Gargamel

Registriert seit: 19. Mär 2007
171 Beiträge
 
#8

AW: Effektivität von Records und Objekten

  Alt 29. Dez 2011, 10:27
Hi

Ja, ich gebe gerne mehr Informationen. Also:

Der Begriff "Gegenstand" war von mir eingangs etwas unglücklich gewählt. Es geht darum, eine, wenn auch recht simple, KI zu programmieren.
Jegliche KI-Routinen finden in einer DLL statt, die 3D-Engine liegt in C++ vor.

Innerhalb der Engine gibt es zwei Aufrufe:

AI_registerObject(objID);
AI_removeObject(objID);

Der Parameter objID ist die interne ID eines Objektes innerhalb der 3D-Engine.

Jegliche zu verwaltende KI-Objekte befinden sich in einem dyn. Array. Die KI-Routinen selbst greifen ausschließlich auf dieses Array zu und berechnen halt diversen Kram. Werden jetzt allerdings Objekte mit AI_removeObject(...) entfernt und neue hinzugefügt, wird das Array nicht nur ständig größer, sondern es verbleiben auch Lücken. Um das zu vermeiden, gibt es ein zweites dyn. Array. Wird ein KI-Objekt mit AI_removeObject(...) entfernt, wird die Indexnummer im ersten Array in dem zweiten Array gespeichert. Pro AI_removeObject(...) wird demnach das zweite Array um einen Eintrag erweitert. Wird AI_registerObject(...) aufgerufen, wird erst im zweiten Array nachgesehen, ob es leere Elemente im ersten Array gibt. Wenn ja, bildet die gespeicherte Indexnummer des letzten Elements im zweiten Array den Index im ersten Array und das letzte Element wird im zweiten Array wieder gelöscht. Auf diese Weise halte ich das erste Array so klein und lückenlos wie möglich.

Der Quellcode dazu besteht bereits. Konkrete Geschwindigkeitsberechnungen habe ich nicht vorgenommen, aber gefühlt lief das alles, auch bei großen Listen, sehr flink.

Die Kommunikation zwischen 3D-Engine und DLL erfolgt über drei Funktionen. Neben AI_registerObject(...) und AI_removeObject(...) gibt es noch eine Funktion, die das berechnete Ergebnis der KI an die Engine übergibt.

Jetzt hat es mich halt interessiert, ob die Verwaltung und interne Berechnung der KI-Objekte über Records oder komplett objektorientiert effektiver ist. Der reine Programmieraufwand ist für mich nicht kriegsentscheidend. Mir kommt es auf die reine Performance und den Speicherverbrauch an.
In diesem Zusammenhang wäre auch interessant, inwieweit Exception-Handling sowohl Performance als auch Speicherverbrauch negativ beeinflusst.

Die KI selbst läuft vollkommen unabhängig von der 3D-Engine auf einem separaten CPU-Kern via Multithreading. Denn es wäre für die Framerate tödlich, jegliche KI-Berechnungen pro Frame auszuführen.

Ich hoffe, daß ihr jetzt alle nötigen Informationen habt, um mir Hinweise zu geben.

Nochmals Danke.

Geändert von Gargamel (29. Dez 2011 um 13:26 Uhr)
  Mit Zitat antworten Zitat