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?