std::vector - stehe ich unter Drogen?
-
Definition von rgbArray in der Klasse ParticleSystem:
static std::vector<RGB*> rgbArray;
Versuch der Initialisierung von rgbArray im Konstruktor von ParticleSystem:
for(unsigned i = 0; i < trailMaxLength; i++) { static RGB tempRGB; tempRGB.r = newParticleRed - ((float)newParticleRed / (trailMaxLength - 1)) * i; tempRGB.g = newParticleGreen- ((float)newParticleGreen/ (trailMaxLength - 1)) * i; tempRGB.b = newParticleBlue - ((float)newParticleBlue / (trailMaxLength - 1)) * i; rgbArray.push_back(&tempRGB); float debugRed1 = rgbArray.at(i)->r; // ONLY FOR DEBUGGING float debugGreen1 = rgbArray.at(i)->g; float debugBlue1 = rgbArray.at(i)->b; } float debugRed2 = rgbArray.at(4[oder 1, 2..])->r; // ONLY FOR DEBUGGING float debugGreen2 = rgbArray.at(4)->g; float debugBlue2 = rgbArray.at(4)->b;
Beim Debuggen schaue ich die Werte von debugRed1 etc. an und beobachte, wie sie sich mit steigendem Wert der Zählvariable i ändern. rgbArray scheint korrekt aufgebaut zu werden.
Wenn ich nun aber nach Schleifenende erneut die Werte von rgbArray untersuche, so muss ich entsetzt feststellen, dann alle Werte 0 sind.Was mache ich falsch?
-
Ich weiß nícht, ob Drogen daran schuld sein können
aber du fügst immer einen Zeiger auf ein und dasselbe statische Element in den Vektor ein, was du zwischendurch in der Schleife veränderst.
Dein Problem läßt eine naheliegende Lösung zu: alle RGB-Instanzen per new zu erzeugen und die entstehenden Pointer in den Vektor zu pushen.
Und eine, die unter Umständen besser sein könnte: RGB ist ein konkreter Typ, der hoffentlich recht billig zu kopieren ist (4 Bytes, right?). Dann benutz doch einen vector<RGB>.
Und mach die temp-Variable nicht static, was soll das?, da bietet sich eine normale automatische Variable an.
-
Bashar schrieb:
Ich weiß nícht, ob Drogen daran schuld sein können
aber du fügst immer einen Zeiger auf ein und dasselbe statische Element in den Vektor ein, was du zwischendurch in der Schleife veränderst.
Dein Problem läßt eine naheliegende Lösung zu: alle RGB-Instanzen per new zu erzeugen und die entstehenden Pointer in den Vektor zu pushen.
Macht Sinn.
Bashar schrieb:
Und eine, die unter Umständen besser sein könnte: RGB ist ein konkreter Typ, der hoffentlich recht billig zu kopieren ist (4 Bytes, right?). Dann benutz doch einen vector<RGB>.
Nein, 3 x 4 Byte.
Basher schrieb:
Und mach die temp-Variable nicht static, was soll das?, da bietet sich eine normale automatische Variable an.
Wenn ich sie automatisch mache, dann muss sie doch bei jedem Schleifendurchgang wieder neu erzeugt werden, was unperformant wäre
Oder etwa nicht?
P.S. Irgendjemand scheint mir immer was ins Essen zu mischen
-
Also 12 Byte neu erzeugen ist nicht wirklich performancelastig. Du könntest es im Zweifelsfall vor der Schleife erzeugen. Ausserdem musst du entscheiden welcher Code zu Lasten der Performance geht und welcher nicht.
-
Ok.
-
Tobias Dallmann schrieb:
Wenn ich sie automatisch mache, dann muss sie doch bei jedem Schleifendurchgang wieder neu erzeugt werden, was unperformant wäre
Oder etwa nicht?
Ist sie denn teuer zu erzeugen? "RGB" klingt IMHO nach nem dummen POD-struct ohne Konstruktor ... dann ist das erzeugen gleichbedeutend mit einer simplen Addition auf den Stackpointer. Zumal idR alle lokalen Variablen einer Funktion gemeinsam erzeugt werden (=> Kosten für die Erzeugung von tempRGB gegen Null), auch wenn eine nur in einem eingeschränkten Bereich sichtbar ist.
-
So ein Quatsch, mach das static weg und definier sie vor der Schleife, oder am Besten gleich im for-Schleifenkopf.
MfG MAV
-
Vielleicht solltest du mal über den vector nachdenken, wenn du Performance willst. Ein vector kann bei Vergößerung sein internes Array neu anlegen und umkopieren. Da wirste wahrscheinlich lange rumoptimieren.
Du kennst doch die Anzahl der Element die hinzufügen werden sollen. Dann kann der Vector doch gleich auf die richtige Größe gebracht werden. Danach sind alle Element vorhanden und können gesetzt werden. Und raus ist tempRGB.
rgbArray.resize(...) z.B.
-
Nimm lieber reserve, das stellt nur den Speicher bereit, resize konstruiert auch die Objekte mit dem Default-Konstruktor, das kostet wieder Zeit.
MfG Jester