Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   weniger Scanline aufrufe ... Graustufenbild (https://www.delphipraxis.net/214629-weniger-scanline-aufrufe-graustufenbild.html)

Michael II 31. Mär 2024 21:04

AW: weniger Scanline aufrufe ... Graustufenbild
 
Hallo Thomas
ich weiss nicht was du in deiner _Callback tust - wahrscheinlich das in #1 ursprünglich verlangte (?).
Hast du deine Varianten 1,2,3 auf deinem Rechner auch "gegen" den Code aus #20 laufen lassen?
Gruss Michael

Amateurprofi 1. Apr 2024 00:32

AW: weniger Scanline aufrufe ... Graustufenbild
 
Zitat:

Delphi-Quellcode:
 BytesPerLine := ((w * 8 * BytesPerPixel + 31) and not 31) div 8;

  DstLine := _DstBmp.ScanLine[0];
  for y := 0 to h - 1 do begin
    DstPixel := DstLine;
    for x := 0 to w - 1 do begin
      _Callback(x, y, PdzRgbTriple(DstPixel)^);
      Inc(DstPixel, BytesPerPixel);
    end;
    Dec(DstLine, BytesPerLine);
  end;

Hallo Thomas,
mir fiel auf, dass Du die BytesPerLine selbst errechnest.
Ich mache das immer so:
Delphi-Quellcode:
DstLine := _DstBmp.ScanLine[0];
if h>1 then BytesPerLine:=NativeInt(_DstBmp.ScanLine[1]) - NativeInt(DstLine)
   else BytesPerLine:=0;
Und
Delphi-Quellcode:
Inc(NativeInt(DstLine), BytesPerLine);
Das erspart Überraschungen wenn die Zeilen in der Bitmap dann doch mal umgekehrt gespeichert sind.

Michael II 1. Apr 2024 01:11

AW: weniger Scanline aufrufe ... Graustufenbild
 
Zitat:

Zitat von Amateurprofi (Beitrag 1535161)
Ich mache das immer so:

Ich in #13, #20, #25 auch ;-).

Amateurprofi 1. Apr 2024 09:03

AW: weniger Scanline aufrufe ... Graustufenbild
 
Zitat:

Zitat von Michael II (Beitrag 1535162)
Zitat:

Zitat von Amateurprofi (Beitrag 1535161)
Ich mache das immer so:

Ich in #13, #20, #25 auch ;-).

Hallo Michael,
sorry, ich hab nicht den ganzen Thread gelesen, nur #30, ansonsten hätte ich mir meinen Kommentar gespart.

dummzeuch 1. Apr 2024 09:59

AW: weniger Scanline aufrufe ... Graustufenbild
 
Zitat:

Zitat von Michael II (Beitrag 1535158)
ich weiss nicht was du in deiner _Callback tust - wahrscheinlich das in #1 ursprünglich verlangte (?).

Wie ich schrieb: Nichts.

Zitat:

Zitat von dummzeuch (Beitrag 1535150)
Dabei bestand das Verarbeiten des Pixels aus einem Aufruf einer leeren Methode mit var-Parameter

Zitat:

Zitat von Michael II (Beitrag 1535158)
Hast du deine Varianten 1,2,3 auf deinem Rechner auch "gegen" den Code aus #20 laufen lassen?

Nein. Ich wollte lediglich diese 3 bzw. 6 Varianten timen. Allerdings ist Algorithmus 3 mit dem Move ziemlich genau das, was auch in #20 steht.

dummzeuch 1. Apr 2024 10:11

AW: weniger Scanline aufrufe ... Graustufenbild
 
Zitat:

Zitat von Amateurprofi (Beitrag 1535161)
mir fiel auf, dass Du die BytesPerLine selbst errechnest.
Ich mache das immer so:
Delphi-Quellcode:
DstLine := _DstBmp.ScanLine[0];
if h>1 then BytesPerLine:=NativeInt(_DstBmp.ScanLine[1]) - NativeInt(DstLine)
   else BytesPerLine:=0;
Und
Delphi-Quellcode:
Inc(NativeInt(DstLine), BytesPerLine);
Das erspart Überraschungen wenn die Zeilen in der Bitmap dann doch mal umgekehrt gespeichert sind.

Ja, in meinem ursprünglichen Code (im ersten Beitrag verlinkt) war das auch noch so, aber das war ein weiterer Aufruf von ScanLine und bei mir geht es um die möglichst effiziente Verarbeitung von 1000en von Bildern.

Ich habe bisher noch keine Bitmap gesehen, die nicht umgedreht gespeichert war (wobei die alle von unseren internen Programmen erzeugt werden, ist also kein Wunder). Und wenn das irgendwann passiert, merkt man das ziemlich schnell, weil es eine Access Violation gibt.

Michael II 6. Apr 2024 10:50

AW: weniger Scanline aufrufe ... Graustufenbild
 
Wenn es dir um Effizienz geht (deine Scanline "Optimierung"), dann solltest du bei zeitkritischen Anwendungen auf die Callback Funktion verzichten. Damit sparst du viel mehr Nanosekunden ;-).
Und wenn du das nicht willst: In vielen Anwendungsfällen kannst du sicher auf die Weitergabe von x,y an deine Callbackfunktion verzichten.
Ich habe auch rasch gemessen: 1220x753 Bild, 1000 Durchläufe:
0: Ist meine Prozedur von weiter oben, 1,2,3 sind deine (mit Callbackfunkton ohne Parameter x,y).
Du hast geschrieben deine 3 sei ähnlich 0; punkto Speed sind sie es nicht. Der Aufruf der Callbackfunktion bremst natürlich in mehrfacher Hinsicht (Prozessorcache, mehr Code).

64Bit App
i7-13620H @ 2.40GHz Win11 Home
0 : 1.184 sec
1 : 4.827
2 : 3.646
3 : 4.074

i7-11800H @ 2.30GHz Win11 Pro
0 : 1.388
1 : 5.765
2 : 4.309
3 : 4.924

AMD EPYC-Rome, 2350 Mhz WinServer 2022
0 : 2.461
1 : 6.577
2 : 5.283
3 : 6.988

Intel Xeon Cascadelake, 2394 MHz WinServer 2019
0 : 3,333
1 : 11,51
2 : 8,333
3 : 10,16


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz