AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

schnelle getPixel Funktion

Ein Thema von schwarzerlotus · begonnen am 16. Aug 2011 · letzter Beitrag vom 17. Aug 2011
Antwort Antwort
Seite 3 von 3     123
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#21

AW: schnelle getPixel Funktion

  Alt 16. Aug 2011, 15:14
Hmm,

also ich versteh es zwar nicht, aber die Lookup-Upversion ist langsamer als die Berechnungsvariante

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.674 Beiträge
 
Delphi 2007 Enterprise
 
#22

AW: schnelle getPixel Funktion

  Alt 16. Aug 2011, 16:05
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.503 Beiträge
 
Delphi 10.4 Sydney
 
#23

AW: schnelle getPixel Funktion

  Alt 16. Aug 2011, 18:07
Ich hab noch nicht so viel mit Delphi gemacht - von daher kann an sich die Assembler Übersetzung in der IDE anzeigen lassen oder hast du dafür ein externes Tool benutzt?
Wenn du an der Stelle einen Haltepunkt gesetzt hast, drückst du Strg + Alt + C. Dann kannst du auch assemblerbefehlsweise durch den Code laufen, falls gewünscht.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#24

AW: schnelle getPixel Funktion

  Alt 16. Aug 2011, 20:36
Ist TGraphic32 nicht eine Option?
Das Bild hängt schief.
  Mit Zitat antworten Zitat
freeway

Registriert seit: 11. Jul 2009
57 Beiträge
 
Delphi XE Professional
 
#25

AW: schnelle getPixel Funktion

  Alt 16. Aug 2011, 21:33
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.674 Beiträge
 
Delphi 2007 Enterprise
 
#26

AW: schnelle getPixel Funktion

  Alt 17. Aug 2011, 00:41
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*
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
schwarzerlotus

Registriert seit: 25. Jul 2011
22 Beiträge
 
#27

AW: schnelle getPixel Funktion

  Alt 17. Aug 2011, 08:25
Moin zusammen

Wenn du an der Stelle einen Haltepunkt gesetzt hast, drückst du Strg + Alt + C. Dann kannst du auch assemblerbefehlsweise durch den Code laufen, falls gewünscht.
thx gut zu wissen

Ist TGraphic32 nicht eine Option?
du meinst http://www.graphics32.org/wiki/ richtig? Hatte ich auch ausprobiert ist aber leider bei den Pixelzugriffen um den Faktor drei langsamer im Vergleich mit der Scanline Variante.

@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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.503 Beiträge
 
Delphi 10.4 Sydney
 
#28

AW: schnelle getPixel Funktion

  Alt 17. Aug 2011, 09:49
CUDA steht auf jeden Fall auf dem Plan für die nächste Zeit und da wir den Vorteil haben unsere Hardware mit auszuliefern ...
CUDA ginge dann ja nur mit NVidia, OpenCL (oder auch Direct Compute Shader) gehen unabhängig davon:
https://code.google.com/p/delphi-opencl/
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf