Czesc!
Chcę narysować coś kilkaset razy i nie wiem czy szybciej będzie to narysować czy kopiować wzorzec np. funkcją CopyRect?
Czesc!
Chcę narysować coś kilkaset razy i nie wiem czy szybciej będzie to narysować czy kopiować wzorzec np. funkcją CopyRect?
zależy, co chcesz rysować - podaj więcej szczegółów
Spróbuj obydwoma sposobami i policz czas wykonania :D.
Niezależnie od tego co chcesz rysować, szybciej będzie na CopyRect.
berl napisał(a)
Niezależnie od tego co chcesz rysować, szybciej będzie na CopyRect.
Próbowałem CopyRect i rysowałem metodą LinesTo. Okazało się że 2x lub nawet 3x szybciej wychodzi metodą drugą czyli LinesTo...
Próbowałem CopyRect i rysowałem metodą LinesTo.
W Delphi nie ma metody LinesTo [diabel] .
Mi tam wychodzi, że CopyRect jest szybsze od LineTo, zależy to oczywiście od liczby rysowanych linii, ale nawet przy jednej linii rysowanej za pomocą LineTo CopyRect jest szybsze. Przy tysiącu linii wychodzi mi, że CopyRect jest szybsze ponad 80 razy. Sprawdzałem tak :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
const
n = 1000; //Liczba rysowanych linii
var
Freq, TimeStart, TimeEnd : Int64;
i: integer;
x, y : integer;
begin
if QueryPerformanceFrequency(Freq) then begin
QueryPerformanceCounter(TimeStart);
for i := 1 to n do begin
x := random(200);
y := random(200);
canvas.MoveTo(x,y);
x := random(200);
y := random(200);
canvas.LineTo(x,y);
end;
QueryPerformanceCounter(TimeEnd);
Label1.Caption := 'Narysowanie tego obrazka za pomocą LineTo zajęło: ' + FloatToStr((TimeEnd-TimeStart)/Freq*1000)+ ' ms';
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
randomize;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Freq, TimeStart, TimeEnd : Int64;
x, y : integer;
srect, drect : TRect;
begin
srect := Rect(0, 0, 200, 200);
drect := Rect(200, 0, 400, 200);
if QueryPerformanceFrequency(Freq) then begin
QueryPerformanceCounter(TimeStart);
Form1.Canvas.CopyRect(drect, form1.canvas, srect);
QueryPerformanceCounter(TimeEnd);
Label2.Caption := 'Narysowanie tego obrazka za pomocą CopyRect zajęło: ' + FloatToStr((TimeEnd-TimeStart)/Freq*1000)+ ' ms';
end;
end;
end.
Ok, zwracam honor. Bo u mnie jest akurat odrwotnie, ale chyba już wiem czego to wina. Nie jest czasem tak, że szybciej się rysuje na Płótnie niż na Bitmapie??
A to nie to samo? Przecież rysujesz na płótnie bitmapy...
jeśli rysujesz na Canvasie jakiegoś obiektu który jest wyświetlany na Formie to będzie to szło wolniej niż rysowanie po Bitmapie.