Rysować czy kopiować?

0

Czesc!

Chcę narysować coś kilkaset razy i nie wiem czy szybciej będzie to narysować czy kopiować wzorzec np. funkcją CopyRect?

0

zależy, co chcesz rysować - podaj więcej szczegółów

0

Spróbuj obydwoma sposobami i policz czas wykonania :D.

0

Niezależnie od tego co chcesz rysować, szybciej będzie na CopyRect.

0
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...

0

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.
0

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??

0

A to nie to samo? Przecież rysujesz na płótnie bitmapy...

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1