Forum: Algorithmen, Datenstrukturen und Klassendesign
by Harry Stahl,
20. Nov 2014
Zusammenfassen der Bit-Varianten wäre zwar möglich, aber bei 24-Bit Bitmaps mit Performance-Verlust verbunden. Bei einer 32-Bitmap kann das System die 4*8 Byte gut in einem Rutsch in die Register einer 32-Bit oder 64-Bit CPU laden. Daher ist dann der Zugriff per Array in den Speicherbereich die effizienteste Lösung. Bei der 24-Bit-Bitmap käme das wegen der nicht passenden Registerbreite nicht so...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Harry Stahl,
20. Nov 2014
Also, um das noch abzuschließen: Offensichtlich ist Scanline nicht threadsafe. Daher habe ich Scanline nur einmal außerhalb des Task-Threads verwendet und innerhalb des Tasks greife ich berechnet auf den DIB-Speicher zu.
Auf einer 6-Kern CPU wird das Bild dann mit ca. 40 MS bearbeitet, also mit Parallel-Bearbeitung 4 mal schneller als ohne.
Hier die fertige Lösung für 24 und 32-Bit-Bitmap...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Harry Stahl,
20. Nov 2014
OK, so sieht das nun fertig aus, abhängig von der Anzahl der CPUs werden entsprechende Worker-Tasks erzeugt, die dann die einzelnen Bildteile berechnen. Auf einem 4-Kern-PC spürt man wirklich einen deutlichen Unterschied.
Hier die geänderten Teile:
var
...
Procedure CreateNewWorkerTask (var T: ITask; L:Integer);
begin
T := TTask.Create(procedure ()
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Harry Stahl,
19. Nov 2014
Ja, in der Tat, hier dauert es nun ca. 570 MS, Beschleunigungsziel wird also nicht erreicht.
Aber auf jeden Fall hast Du schon mal mehr Licht ins Dunkel gebracht, also dafür schon mal vielen Dank. Werde weiter probieren und posten, wenn ich die Lösung habe...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Harry Stahl,
19. Nov 2014
Also nach meinen bisherigen Erfahrungen und Tests ist Scanline immer der Flaschenhals, weil eben Scanline soviel Aufrufe selbst noch tätigt. Meine optimierten Routinen (dazu gehört das gezeigte Beispiel nicht) verwenden immer nur einen einzigen Aufruf von Scanline (um die Startposition zu erhalten), die restlichen Zugriffe finden aufgrund von Berechnungen statt.
Davon abgesehen greife ich hier...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Harry Stahl,
19. Nov 2014
Scanline kannst Du auch mit einem 24-Bit-Bitmap verwenden, Du musst halt nur berücksichtigen, dass hier auf 3 Bit gezeigt wird (bei 32-Bit auf 4 Bit).
OK, in einem Thread ist das wirklich keine gute Idee.
Ich versuche mal einen anderen Ansatz, das mit TTask zu beschleunigen, also einmal den oberen Teil der Bitmap berechnen, dann den unteren Teil, beides halt (fast) gleichzeitig. Da ich...
Forum: Algorithmen, Datenstrukturen und Klassendesign
by Harry Stahl,
18. Nov 2014
Ich würde gerne die TParallel-Library einsetzen, um verschiedene Bitmap-Routinen schneller zu machen.
Ich habe hier versucht, das mal für eine 24-Bit-Bitmap zu implementieren (Funktion, welche abhängig von einem Wert eine Bitmap aufhellt bzw. abdunkelt):
procedure Helligkeit(Bitmap: TBitmap; Const Original : TBitmap; Value: integer; IgnoreWhite: Boolean);
var
x,y : integer;
Ziel ...