Entwickler-Ecke

Multimedia / Grafik - Canvas.Draw Beschleunigen


Arakis - Mi 27.11.02 23:50
Titel: Canvas.Draw Beschleunigen
Hi, ich zeichne per Canvas mehrere Bilderchen von 32x32 Pixel Nebeneinander, sind ca. 100 Stück. Aber das zeichen dauert so laaaaangsam und man kann dabei zusehen. Gibt es irgendeine Möglichkeit das zu beschleunigen?


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm_Main.Button1Click(Sender: TObject);
var
  Bit: TBitmap;
begin
  bit := Tbitmap.Create;
  ImageList.GetBitmap(0, bit);
  //jetzt 100 mal das bild auf der Zeichenfläche malen
  {...}
  self.PaintBox.Canvas.Draw(0 , 0, bit);
  {...}
end;

Bis dann
user defined image


UGrohne - Do 28.11.02 00:38

Das Canvas-Objekt ist generell ziemlich langsam. Du könntest per WinAPI oder DirectDraw (unter NT GDI o.ä.) wahrscheinlich viel bessere Ergebnisse erzielen. Hab auch öfter mit Canvas gearbeitet und es war meistens zum K....

Gruß


Arakis - Do 28.11.02 00:41

Hättest du da ein kleines Bespiel? Ich muss halt ein TBitmap bzw. TGraphic n mal zeichnen.

Bis dann
user defined image


Anonymous - Do 28.11.02 01:30

Du könntest versuchen zuerst alles auf einer Bitmap zu zeichnen und dann alles zusammen auf PaintBox. Allerdings war bei mir keine der beiden Varianten langsam:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
var
  bit, bit2: TBitmap;
  x, y: Integer;
begin
  bit := Tbitmap.Create;
  bit2 := Tbitmap.Create;
  try
    bit2.Width := PaintBox1.Width;
    bit2.Height := PaintBox1.Height;
    for x := 0 to 9 do for y := 0 to 9 do begin
      ImageList1.GetBitmap(0, bit);
      //jetzt 100 mal das bild auf der Zeichenfläche malen
      {...}
      bit2.Canvas.Draw(x * bit.Width , y * bit.Height, bit);
      {...}
    end;
    PaintBox1.Canvas.Draw(0 , 0, bit2);
  finally bit2.Free; bit.Free end;
end;


Du kannst dir hier etwas zu GDI anlesen:

http://www.hanser.de/leseprobe/2001/3-446-21734-7.pdf

Aber auch wenn du direkt mit der GDI / API zeichnest, ich glaube nicht, daß es viel schneller wird. Auf die schnelle könnte man die Draw gegen BitBlt tauschen.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var
  bit, bit2: TBitmap;
  x, y: Integer;
begin
  bit := Tbitmap.Create;
  bit2 := Tbitmap.Create;
  try
    bit2.Width := PaintBox1.Width;
    bit2.Height := PaintBox1.Height;
    for x := 0 to 9 do for y := 0 to 9 do begin
      ImageList1.GetBitmap(0, bit);
      //jetzt 100 mal das bild auf der Zeichenfläche malen
      {...}
      BitBlt(bit2.Canvas.Handle, x * bit.Width, y * bit.Height,
        bit.Width, bit.Height, bit.Canvas.Handle, 0, 0, SRCCOPY);
      {...}
    end;
    PaintBox1.Canvas.Draw(0 , 0, bit2);
  finally bit2.Free; bit.Free end;
end;


Teste es mal und sag das Ergebnis.


Arakis - Do 28.11.02 02:07

Danke Popov, läuft schon viiiieeel schneller. Aber ich glaub der Fehler lag woanders. Ich hab die Zeichenfunktion ausversehen nicht 100 mal, sondern, Hut ab, 100 Fakultät aufgerufen. Kein Wunder, dass es jedesmal die Fehlermeldung OutOfRessources kam :oops:

Bis dann
user defined image