Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Zeichnen eines Plots beschleunigen (TImage)

  Alt 8. Dez 2007, 19:17
Delphi-Quellcode:
procedure drawgraph(arr:tintarr;bmp:tbitmap);
var
  i,x:integer;
  rows: packed array of integer;
  ptr: pcolrec;
  cl1,cl2: tcolrec;
begin
  with bmp do
  begin
    bmp.PixelFormat := pf32bit;
    Canvas.Brush.color := clbtnface;
    Canvas.pen.color := clblack;
    Canvas.Rectangle(0,0,width,height);
    setlength(rows,bmp.Height);
    // tabelle für zeilen erstellen
    for i := bmp.height-1 downto 0 do
      rows[i] := integer(bmp.ScanLine[i]);
    // record für Farbe 1
    cl1.g := 0; cl1.b := 0; cl1.r := 255; cl1.a := 255;
    // record für Farbe 2
    cl2.g := 127; cl2.b := 0; cl2.r := 0; cl2.a := 255;
    x := 4;
    for i:=0 to 300-1 do
    begin
      // PixelPointer berechnen
      // < Y > < X >
      ptr := pointer(rows[300-arr[i]] + x);
      if arr[i]=i then
        ptr^ := cl2 // grün
      else
        ptr^ := cl1; // rot
      inc(x,4);
    end;
  end;
end;
Mit dieser Funktion kann man bei 1000 Durchläufen 100ms rausholen... mehr nicht. Das langsamste an der Sache ist Canvas.Rectangle.

//Edit: Falls es wen interessiert:
OHNE Rectangle:
---------------------------
Scanline: 109
Canvas: 219
---------------------------

MIT Rectangle:
---------------------------
Scanline: 437
Canvas: 532
---------------------------
//EditEdit:
Typendeklaration:
Delphi-Quellcode:
  tcolrec = packed record
    b,g,r,a: byte;
  end;
  pcolrec = ^tcolrec;
  Mit Zitat antworten Zitat