Autor Beitrag
Arakis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 344



BeitragVerfasst: Mi 27.11.02 23:50 
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?

ausblenden 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

_________________
Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 344



BeitragVerfasst: 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

_________________
Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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:

ausblenden 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:

www.hanser.de/lesepr...01/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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 344



BeitragVerfasst: 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

_________________
Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!