std::vector, die 20te
-
particleArray.at(i).draw( particleArray.at(i).trail.at(j).first, particleArray.at(i).trail.at(j).second, rgbArray.at(j).r, rgbArray.at(j).g, rgbArray.at(j).b);
Ich schreibe gerade eine nette Partikel-Demo, doch die Performance lässt stark zu wünschen übrigt. Bei 40.000 Partikeln erreiche ich momentan nur 3,5 FPS.
Für jeden Partikel und jedes Frame wird die obige Methode aufgerufen, insg. also 40.000 mal pro Frame.Man könnte also das Problem innerhalb der draw-Methode vermuten, doch das ist ein Trugschluss. Wenn ich den obigen Block durch
particleArray.at(i).trail.at(j).first; particleArray.at(i).trail.at(j).second; rgbArray.at(j).r; rgbArray.at(j).g; rgbArray.at(j).b;
ersetze, und damit die Methode gar nicht mehr aufrufe, sondern nur noch die Methoden, die oben eingesetzt wurden um die Werte der Argumente zu ermitteln, so wird das Programm dadurch um nichts schneller. Lasse ich diese Befehle aber ganz weg, so steigt die Ausführungsgeschwindigkeit auf immerhin 15 FPS!
Das kann doch nicht sein, dass diese at-Methoden solche Performancefresser sind
Bitte um Rat
-
at testet auf Bereichsüberschreitungen... Das brauchst du bestimmt garnicht. Nimm besser den []-Operator.
-
Ich bezweifle aber, dass diese Bereichsüberschreitungs-Tests so viel Zeit kosten.
Werde es aber sofort mal testen!
-
Tobias Dallmann schrieb:
Ich bezweifle aber, dass diese Bereichsüberschreitungs-Tests so viel Zeit kosten.
Es muss idR ein Haufen 'unwind-code' erzeugt werden, da die Fehlerüberprüfung schließlich über Ausnahmen läuft. Zusätzlich ist es nur mäßig schlau, ständig die gleichen Methoden aufzurufen. Man muss den Optimizer ja nicht prozozieren, nur um schwerer verständlichen Code geschrieben zu haben.