![]() |
AW: schnelle getPixel Funktion
Hmm,
also ich versteh es zwar nicht, aber die Lookup-Upversion ist langsamer als die Berechnungsvariante :gruebel: Gruß, Chris |
AW: schnelle getPixel Funktion
Griffe in den Heap kosten nun mal auch, und bei einem 2D-Array muss intern ebenso wie bei einem Bitmap der 2D-Index zu einer "1D"-Adresse umgerechnet werden. Man hat quasi das selbe Problem damit nur verdoppelt - fiel mir aber auch erst nicht auf, da LUTs an sich oft ja schon helfen. Aber wohl dann doch eher nicht, wenn man eine Multiplikation und eine Addition gegen das selbe plus etwas mehr Traffic aufm Bus eintauscht :)
|
AW: schnelle getPixel Funktion
Zitat:
|
AW: schnelle getPixel Funktion
Ist TGraphic32 nicht eine Option?
|
AW: schnelle getPixel Funktion
die kochen doch alle nur mit Wasser ;)
Bisher hab ich noch keine Alternative gesehen die einen signifikanten Vorteil bietet. Selbst die Berechnung der Adressen zum direkten Zugriff ist nur marginal schneller. Sourcecode zum damaligen Test
Delphi-Quellcode:
Var pic_Line : integer;
row : PRGB32Array; pic_offset, pic_data : integer; red_count : integer; type TRGB32 = packed record B, G, R, A: Byte; end; TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32; PRGB32Array = ^TRGB32Array; implementation {$R *.DFM} procedure TForm1.Start(Sender: TObject); var x, y, i: Integer; begin setlength(steps_adr,10); if not openDialog1.Execute then exit; image1.Picture.Bitmap.LoadFromFile(OpenDialog1.Filename); with Image1.Picture.Bitmap do begin PixelFormat := pf32bit; row := Scanline[0]; //start position pic_Line := (Longint(Scanline[1]) - Longint(row)) div SizeOf(TRGB32); //direction end; count_red(Sender); end; procedure TForm1.count_red(Sender: TObject); begin pic_offset := Y * pic_Line; //offset pic_data := Image1.Picture.Bitmap.Width - 1 + pic_offset; //data for x := pic_offset to pic_data do with row[x] do begin // B := 0; // G := 0; red_count := red_count + R; // A := 0; end; Image1.Invalidate; end; end. |
AW: schnelle getPixel Funktion
Die (derzeit, auf Consumer-Hardware) höchste Instanz der Optimierung von paralleler Massendatenverarbeitung wäre natürlich die Nutzung der GPU. Entweder mittels Shadern (DirectX/OpenGL), oder etwas mehr auf allgemeine Zwecke ausgelegt CUDA/OpenCL. Leider hat man bei allen vieren für Delphi nicht die ausgewachsensten Frameworks (bei letzteren eigentlich nirgends...), und es ist eine völlig andere Art der Programmierung, die wenn frisch angegangen sicherlich einiges an Lernzeit braucht bis es mal produktiv eingesetzt werden kann. Meiner eigenen Erfahrung nach sind dort allerdings durchaus Performancezuwächse von Faktoren um 50-100 zu bereits gut optimiertem CPU Code locker drin, dafür stellt man aber dann auch wieder etwas speziellere Hardwareanforderungen an den Kunden.
Wenn Zeit aber so entscheidend ist, könnte sich so ein Exkurs ggf. auch lohnen. Allerdings ist das Lernen der APIs und Sprachen nicht alles: Man müsste zudem etwas tiefer in die Theorie zur Parallelisierung von Algorithmen (und das Thema "Was mag meine Hardware gern?") einsteigen um eine bestehende Aufgabe günstig zu zerlegen zu wissen. Vorteil des ganzen: Es ist ein verflucht spannendes und zukunftsträchtiges Thema! Mir z.B. hat es sogar die Idee (und überhaupt praktische Anwendbarkeit dieser) zu meiner Abschlussarbeit geliefert - welche als Spaß-Projekt um genau o.g. (und C#) mal genauer anzuschauen begann. Ist, als Neuling in diesem Gebiet, sicherlich nichts für nächste Woche rund und fertig, aber wenn du die Zeit und Muße hast, auch für später nicht die schlechteste Übung. So frei nach dem Motto "Horizont, ick hör dir Trappsen" :) Und gerade Bitmapverarbeitung böte sich da als quasi Hybrid zwischen Bilddaten und allgemeinen Berechnungen geradezu an - nahezu alle Bitmap-Operationen lassen sich hervorragend parallelisieren *mundwässrigmach* ;) |
AW: schnelle getPixel Funktion
Moin zusammen
Zitat:
Zitat:
![]() @Medium CUDA steht auf jeden Fall auf dem Plan für die nächste Zeit und da wir den Vorteil haben unsere Hardware mit auszuliefern ... ;) Danke an alle für die vielen Ideen und Anregungen |
AW: schnelle getPixel Funktion
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 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-2025 by Thomas Breitkreuz