Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich würde nicht mit einem Byte array arbeiten, weil es dabei schon gelegentlich zu Bereichsfehlern gekommen ist, da es nur ein Array bis 32767 ist. Und wenn man auf ein Feld dahinter zugreifen will, dann blokiert Delphi das.
Ist der Vorherige Code nur ein wenig angepasst.
Code:
var
pData, pLine:PByte;
i, LineSize:Integer;
begin
bmp.PixelFormat:= pf32bit;
LineSize := bmp.width*4;
getmem(data, LineSize * bmp.height);
for i:=0to bmp.Height-1do
begin
pLine := bmp.ScanLine[i];
move(pLine^, pData, LineSize);
inc(pData, LineSize);
end;
...
end;
So sparrt man sich ein paar Berechnungen. Das dürfte aber so gut wie kaum ins Gewicht fallen. Viel wichtiger ist wahrscheinlich, dass du dir ein Grafikkartenfreundliches Texturformat aussuchst. Also mal Testen welches Format am schnellsten hochgeladen werden. Evtl ist es ja mit Alpha auch schneller ob wohl es mehr ist.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wie wäre es denn, wenn du dann gleich Bmp.Scanline[Hdr.Height-1] an glTexSubImage2D übergibst. Müsste ja dann auch gehen, wenn das einfache kopieren auch geht. Oder evtl. erst die Adresse in einem Pointer ablegen und dann übergeben.
Du solltest dann aber auf jeden Fall darauf achten, dass die Bilddaten bei dem Bitmap lückenlos sind. Denn die Bilddaten werden werden in 4 Bytealignment abgelegt. Also kann es passieren, dass am Ende einer jeden Zeile noch 1-3 Bytes zu viel dran sind. Das würdest du dann aber im Bild sehen. Bei 32 Bit Bildern dürfte es generell keine Probs geben, da 1Pixel = 4Byte.
Also mein format ist grundsätzlich hier 24 Bit.
Deshalb steht bei mir bei erst-erstellung der Texture eine 3 Byte ausrichtung im Format GL_BGR.
hab aber ein problem mit der Geschwindigkeit hier:
Mein vorgang sieht so aus:
- in nem TFileStream zu ner Position springen wo mein Bild liegt
- Danach das Bild in nen TMemoryStream lesen
- Dann via TJpegImage den MemoryStream laden
- Dann das TJpegImage mit Assign dem TBitmap zuweisen
- Die Bitmap Scanline daten in den Speicher kopieren welchen OpenGL zugeteilt wurde
- via glTexSubImage2D die Daten uploaden
der gesamte vorgang dauert ca. 40ms an einem AMD 2000+, 512 DDR 333 und ner GF 6800 128 MB.
Normalerweise wäre nur ne GeForce1 drin, aber hab meine Karte von Zuhause mit wegen dem "Non Power of Two Textures" feature.
Gibt es ne möglichkeit das ganze schneller zu machen ?
Weil 40 ms ist defnitiv zu lang Wäre es arg viel schneller bei ner S-ATA platte, P4 HT 2,8 und 1024 DDR 400 RAM ?
Zuletzt geändert von Finalspace am Mo Mai 30, 2005 14:52, insgesamt 1-mal geändert.
Wie wäre es denn, wenn du dann gleich Bmp.Scanline[Hdr.Height-1] an glTexSubImage2D übergibst.
Würde ich ja gern machen, da der Speicherkopiervorgang gut 10 ms frisst.
Aber da gibts ein problem:
Wenn ich anstatt meine Bilddata : PByte, nen TBitmap habe dann muss es ja folgendermassen ablaufen:
Initialisiere das Bitmap, setzte es auf ne grösse.
und dann wenn das JPEGImage geladen ist, mach nen Assign.
Assign killt ja die kompletten vorherigen daten und erstellt dann ja nen neuen Speicherbereich oder seh ich da was falsch ?
Probiert hab ichs nich, aber das is meine vermutung.
Ich versuchs mal...
*Edit:
Geht, spare dadurch 5 ms Reicht aber immernoch nicht
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
Wäre es arg viel schneller bei ner S-ATA platte, P4 HT 2,8 und 1024 DDR 400 RAM ?
Ich tippe mal darauf, dass nicht, da du ja nur 50 KB lädst. Und das geht auch mit UDMA ziemlich schnell. Evtl könnte der Spur zu Spur zugriff und die Seektime der Platte nen kleinen Obolus bringen.
Wieso Lädst du nicht direkt aus dem FileStream? Geht es mit einem ZwischenMemstream schneller?
Ne andere Idee wäre zum Beispiel nicht das JPG auf das BMP zu assignen sondern auf dessen Canvas zu zeichnen. Dann könntest du auch evtl mal ausprobieren wie es mit 32 Bit Texturen aussieht. Evtl werden die ja schneller auf die Karte kopiert.
Mitglieder in diesem Forum: 0 Mitglieder und 22 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.