![]() |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Der Effekt tritt schon auf, wenn man in den Compileroptionen die Optimierung aktiviert (und natürlich ein Rebuild des Projekts macht). Interessanterweise ist die ASM-Variante mit aktiver Optimierung offenbar langsamer also ohne.
Code:
005C61C7 8BC7 mov eax,edi
Unit13.pas.143: for x := 0 to z-1 do begin 005C61C9 48 dec eax 005C61CA 85C0 test eax,eax 005C61CC 7C14 jl $005c61e2 005C61CE 40 inc eax 005C61CF 33D2 xor edx,edx Unit13.pas.144: if RGBA[x].rgbReserved <> 255 then begin 005C61D1 807C9303FF cmp byte ptr [ebx+edx*4+$03],$ff 005C61D6 7406 jz $005c61de Unit13.pas.145: EXIT (TRUE); 005C61D8 C645FF01 mov byte ptr [ebp-$01],$01 005C61DC EB04 jmp $005c61e2 Unit13.pas.147: end; 005C61DE 42 inc edx Unit13.pas.143: for x := 0 to z-1 do begin 005C61DF 48 dec eax 005C61E0 75EF jnz $005c61d1 |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Assembler-Befehle wie LOOP sollte man heutzutage nicht mehr verwenden, die sind auf modernen CPUs ziemlich langsam. Vermutlich liegt es daran.
Wenn schon Assembler, dann wäre eher was mit SIMD interessant. Ansonsten würde mir noch folgende reine Pascal-Alternative einfallen:
Delphi-Quellcode:
Statt auf den Pointer einen Offset von 3 Bytes hinzuzuaddieren, werden die 32 Bit einfach maskiert. Ob das schneller ist, keine Ahnung.
function HasTransparentRGBAValues (const bm:TBitmap): Boolean;
var x, z: Integer; pixel: PLongWord; begin Result := FALSE; pixel := bm.Scanline[bm.Height-1]; z := bm.Width * bm.Height; for x := 0 to z-1 do begin begin if (pixel^ and $FF000000) <> $FF000000 then EXIT (TRUE); inc(pixel); end; end; |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Zitat:
Delphi-Quellcode:
nicht compilieren lässt, ist sie zeitlich gleichauf mit der ursprünglichen Routine. Insofern ist bisher noch der einzige erfolgreiche Ansatz zur Optimierung das Aktivieren der Optimierung in den Compileroptionen.
begin
|
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Hab ne andere Idee:
Delphi-Quellcode:
Ob das schneller ist, ist natürlich die Frage weil die ganze Schleife durchlaufen muss.
function HasTransparentRGBAValues (const bm:TBitmap): Boolean;
var x, z: Integer; pixel: PRGBQuad; sum: Cardinal; begin pixel := bm.Scanline[bm.Height-1]; z := bm.Width * bm.Height; sum := 0; for x := 0 to z-1 do begin sum := sum + pixel^.rgbReserved; inc(pixel); end; Result := sum < (z * 255); end; Dafür spart man sich ggf. ne Menge Vergleiche. Ein Versuch ists Wert denke ich. |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Bei Assambler kann keine Codeoptimierung greifen. :stupid:
|
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Da die Verrechnungsvariante auf jeden Fall deutlich länger dauert, als die Variante des Drüberkopierens, lohnt es sich, zunächst rauszufinden, ob das Bild eine Transparenz hat oder nicht. Oft ist es bei Bildkompositionen so, dass die Hintergrundebene ohne Transparenz ist und die drüberliegenden Bilder mit Teiltransparenzen. I.d.R. ist dann auch das Hintergrundbild das größte Bild von allen und da muss ich dann halt eben einmal ganz durchprüfen, braucht aber relativ viel Zeit, die ich gerne noch etwas reduzieren möchte. |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Hast du meinen letzten Vorschlag mal probiert?
Würde mich echt interessieren ob das schneller ist :) |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Liste der Anhänge anzeigen (Anzahl: 1)
Hey, Danke erst mal an Alle, die sich hier an den Überlegungen beteiligt haben.
In der Tat muss man den Einwand von Uwe berücksichtigen, ob mit Debug oder Release kompiliert. Da die Auslieferung des Programms natürlich in Release erfolgt, ist das letztlich der Maßstab (hatte mein Demo aber im Debug-Modus getestet). Anliegend daher die hier aufgeführten Varianten einmal zum Testen eingebaut, die jeweilige Methode kann man aus der Drop-Downbox auswählen. Die ASM-Variante ist die schnellste im Debug-Modus (ca. 32 MS, im Gegensatz zu meiner Standard-Methode hier mit ca. 50 Ms). Im Release Modus bleibt die ASM-Variante bei 32 MS und meine Standard-Methode kommt auf ca. 24 MS. |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Zitat:
Also im Release-Modus leider nicht schneller. Wenn es da den SUPER-ASM-Befehl nicht gibt, müsste man sich vielleicht in den DirectX-Funktionen noch einmal umsehen, evtl. gibt es da etwas, was per GPU-Unterstützung diese Frage beantworten kann. |
AW: Prüfung eines Bitmaps auf Transparenz (gehts noch schneller)?
Hast du an andere Wege der Optimierung gedacht, wird die Information für jede Bildebene irgendwo gespeichert?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz