Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.08.2003, 11:33

Turbo Array

Folgende Optimierung fällt mir für die Games im Buch ein (vielleicht was für ne 2. Auflage ;-))

In den Spielen werden gerne Arrays fester Größe verwendet, bei denen alle "aktiven" Elemente (Partikel, Objekte, ...) durch einen Bool aktiviert/deaktiviert werden. Nehmen wir im Folgenden als Beispiel ein Partikel-Array:

Blöd is meiner Meinung nach, daß bei einer maximal möglichen Anzahl von 10000 Partikeln immer alle Positionen des Arrays zum Rendern durchlaufenb werden müssen

Quellcode

1
2
3
for (int i=0; i<10000; i++)
  if (particle[i].bActive)
   particle[i]->render();

Performanz beim Rendern ist nicht optimal bei wenig aktiven Partikeln; Performanz bei einem recht vollen Array ist beim Anlegen neuer Partikel auch nicht optimal.

Die Lösung über die STL ist auch nicht das Wahre. Angeblich ist die Performanz dabei auch nicht so doll (weil halt für sehr viele Anwendungsgebiete gedacht (und nicht um bei 100fps in jedem Frame 10000 mal drüber zu laufen)) AUßerdem sind Iteratoren :kotz:

Nun genuch gesülzt, hier meine Idee:
Template-Klasse anlegen (für Wiederverwendung, das Freut die Informatik Profs ;-)). Bei Erzeugung wird neben dem gewünschten Datentyp für die Elemente die Größe des Arrays angegeben (hier die 10000).

Es wird ein Zeiger x auf das letzte Element im Array gespeichert.

Neues Element anlegen:

Quellcode

1
array[++x]=neuesElement


Element Nr. y löschen:

Quellcode

1
array[y]=array[x--]


Array leeren:

Quellcode

1
x=0;


Das Array muß bei Durchläufen (wie beim Rendern aller Objekte) nur bis zur Obergrenze x durchlaufen werden. Einfügen geht echt zügig. Einziges Problem ist der Kopiervorgang beim Löschen.

Wenn ich das nur mal mit diesen Templates auf die Kette kriegen würde :angel:

Meinungen dazu?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

11.08.2003, 12:20

Das habe ich schon so gemacht, bei den Partikeln, auch in der ersten Auflage :)
Und es gibt sogar schon eine Template-Klasse in der TriBase-Engine dafür. Sie ist nur nirgendwo erwähnt. Der Name ist tbDynList.

Wenn das hier die Liste ist:
ABCDEFGHIJKLMNOPQRSTUVWXYZ

Und ich lösche das Element G, dann sieht sie nachher so aus:
ABCDEFZHIJKLMNOPQRSTUVWXY

Bei Partikeln ist das OK, da man die Render-Reihenfolge eh kaum merkt.

3

11.08.2003, 12:30

Zitat von »"David Scherfgen"«

Das habe ich schon so gemacht, bei den Partikeln, auch in der ersten Auflage :)

Oh, klasse :)

Werbeanzeige