co jest szybsze: LineTo czy PolyLine ?

0

wtam.
mam takie pytanko, co jest szybsze:
rysowanie za pomoca LineTo()
czy robienie tablicy z punktami i rysowanie uzywalac PolyLine()?
jesli cos jest szybsze... duzo? ;]

dzieki z gory [browar]
pozdrawiam
cimak

0

nie możesz sprawdzić ? :/

0

I tak obydwa są relatywnie wolne, bo to GDI Windowsa jest. Więc czy zrobisz własną funkcję używającą LineTo, czy też wywołasz PolyLine, to i tak jakiekolwiek zyski/straty zostaną zagłuszone przez opóźnienia związane z rysowaniem za pomocą GDI. Zasadniczo kierowałbym się tylko jednym: jeśli tylko rysujesz figurę i o niej zapominasz, to użyj LineTo, po co masz tworzyć tablice, żeby je za chwilę usunąć. Jeśli informacje o figurze przechowywane w tablicy wierzchołków do czegoś ci się przed/po rysowaniu przydadzą, to użyj PolyLine - skoro i tak musisz stworzyć tablicę, to ją wykorzystaj gdzie się da :]

0

To idąc tym tokiem myślenia poleciłbym PolyLine, bo tablicę można zadeklarować jako stałą. Daje to mniej pisania (nie ciągłe LineTo, LineTo i LineTo) i ładnie w jednym miejscu zebrane wszystkie wierzchołki figury. Trzeba dbać o swoją wygodę :)

0

sprawdzilem i ku mojemu zaskoczeniu LineTo jest duzo, duzo szybsze. np zamalowanie calej fomry w przypadku lineto trwalo np 100ms podczas gdy polyline ponad sekunde!!
a jesli chodzi o zapamietywanie... uzywam image'a wiec nic sie nie zamazuje. ale dzieki;]
pozdrawiam;]

0

ScanLine

0

Do Criso:
ScanLine jest oczywisty przy optymalizacji, ale nie w benchmarkach, które porównują wydajność dwóch funkcji. Czas benchmarku siłą rzeczy powinien być długi, bo wahania +/- 50ms to normalka.

Do Cimak:
Cholera, nie chciało mi się sprawdzać nawet tych lini, ale swoją rewelacją mnie zmotywowałeś :]
Wyniki porównania szybkości TYLKO rysowania przez funkcje są oczywiste - niczym się nie różnią (100ms podczas ponad 10-cio sekundowego testu) . A gdyby komuś takie porównanie nie odpowiadało, bo jest formalne, ale nie za bardzo praktyczne, to jest jeszcze test, w którym LineTo jest wywoływana w optymalny sposób. Wykonanie jest szybsze o jakieś 20% i jest spowodowane lepszą organizacją kodu programisty, a nie algorytmem wewnątrz funkcji rysującej. Nigdzie nie zauważyłem 10-krotnego wzrostu wydajności :]

11422 - LineTo
11531 - PolyLine
9313 - LineTo (wersja zoptymalizowana)

Poniżej kod funkcji:

procedure TForm1.PolyTest(Sender: TObject);
var points: array[1..5] of TPoint;
    time: Cardinal;
    i,p: integer;
begin
   time := GetTickCount;

   for i:=1 to 250000 do begin
      // generowanie punktów
      for p:=1 to 5 do begin
         points[p].x := random(im.Width);
         points[p].y := random(im.Height);
      end;
      // rysowanie
      im.Picture.Bitmap.Canvas.Polyline(points);
   end;
   ShowMessage(IntToStr(GetTickCount()-time));
end;
procedure TForm1.LineToTest(Sender: TObject);
var points: array[1..5] of TPoint;
    time: Cardinal;
    i,p: integer;
begin
   time := GetTickCount;

   for i:=1 to 250000 do begin

      // generowanie punktów
      for p:=1 to 5 do begin
         points[p].x := random(im.Width);
         points[p].y := random(im.Height);
      end;
      // rysowanie: w drugej pętli, bo porównujemy szybkosc TYLKO funkcji 
      // rysujacych! A wiec nie zmieniamy struktury kodu towarzyszącego
      // (nie pakujemy do jednej pętli, również czytamy punkty z tablicy etc)
      im.Picture.Bitmap.Canvas.LineTo(points[1].x, points[1].y);
      for p:=2 to 5 do
         im.Picture.Bitmap.Canvas.LineTo(points[p].x, points[p].y);
   end;
   ShowMessage(IntToStr(GetTickCount()-time));
end;
procedure TForm1.OptimizedLineToTest(Sender: TObject);
var time: Cardinal;
    i,p: integer;
begin
   time := GetTickCount;

   for i:=1 to 250000 do begin
      im.Picture.Bitmap.Canvas.MoveTo(random(im.Width), random(im.Height));
      for p:=2 to 5 do
         im.Picture.Bitmap.Canvas.LineTo(random(im.Width), random(im.Height));

   end;
   ShowMessage(IntToStr(GetTickCount()-time));
end;

Dlatego w całości podtrzymuję pierwszego posta. Jeśli nie używasz tablicy wierzchołków do innych obliczeń, to używaj LineTo - zaoszczędzisz te 20%, które program zużywa na obsługę tablic. Jeśli tablicę będziesz wykorzystywał później np w jakichś obliczeniach (więc i tak ją musisz utworzyć) to używaj PolyLine, bo samo RYSOWANIE trwa dokładnie tyle samo.

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