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
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
nie możesz sprawdzić ? :/
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 :]
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ę :)
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;]
ScanLine
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.