GuaAck hat folgendes geschrieben : |
Mit meinem Programm war mal Pixels[i,j] schneller und mal Scanline. In der Delphi-Hilfes steht, dass Scanline nur für Device-independent-Bitmaps (DIB) angewendet werde.
Da habe ich einen kleinen Test gemacht und eine frisch creierte Bitmap zeilenweise mit Pixelfarbe beschrieben (Aus Zeile und Spalte, so dass ein hübsches, erkennbares Muster entsteht)
Die Tabelle unten zeigt: Scanline ist schnell, aber nur bei DIBs (pF24bit und pf32bit gelten nach Delphi-Hilfe als DIBs). pfdevice ist Default bei TBitmap.create! |
Scanline ist eigentlich
immer schneller!
Ja, du kannst Scanline bei pfDevice verwenden, aber das ist ganz schlechter Stil, denn im Hintergrund passiert das:
1. TBitmap.GetScanLine wird aufgerufen
2. Das ruft TBitmap.Changing auf
3. Das wiederum ruft TBitmap.FreeImage auf, welches ein eventuell vorhandenes DIBHandle freigibt, wenn das Bitmap ein DDB (pfDevice) ist.
4. Jetzt sind wir zurück in TBitmap.GetScanLine, was logischerweise ein DIB benötigt um direkt auf die Pixeldaten zugreifen zu können.
Also ruft es TBitmap.DIBNeeded auf, was das DDB in ein DIBHandle kopiert.
Es ist also so, dass bei pfDevice
jede Benutzung von Scanline ein neues, temporäres DIB erstellen muss, wobei die Pixeldaten dann hin- und her kopiert werden! Kein Wunder also, dass das bei größeren Dimensionen langsamer wird.