Я просто играю с FireMonkey, чтобы увидеть, будет ли графическая картина быстрее, чем GDI или Graphics32 (сейчас моя библиотека выбора).
Чтобы узнать, насколько это быстро, я выполнил несколько тестов, но я столкнулся с каким-то нечетным поведением:
Чертежные тонкие линии (< 1,5 пикселя в ширину), по-видимому, чрезвычайно медленны по сравнению с более толстыми линиями:
- Вертикальная ось: процессор печатает 1000 строк.
- Горизонтальная ось: тиканье линии *
Результаты довольно стабильны; рисунок всегда становится намного быстрее, если ширина линии больше 1 пикселя.
В других библиотеках, кажется, есть быстрые алгоритмы для одиночных строк, а толстые линии медленнее, потому что сначала создается многоугольник, так почему же FireMonkey наоборот?
Мне в основном нужны однопиксельные линии, поэтому следует рисовать строки по-другому, возможно?
Тесты выполнялись с помощью этого кода:
// draw random lines, and copy result to clipboard, to paste in excel
procedure TForm5.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
i,iWidth:Integer;
p1,p2: TPointF;
sw:TStopWatch;
const
cLineCount=1000;
begin
Memo1.Lines.Clear;
// draw 1000 different widths, from tickness 0.01 to 10
for iWidth := 1 to 1000 do
begin
Caption := IntToStr(iWidth);
Canvas.BeginScene;
Canvas.Clear(claLightgray);
Canvas.Stroke.Kind := TBrushKind.bkSolid;
Canvas.Stroke.Color := $55000000;
Canvas.StrokeThickness :=iWidth/100;
sw := sw.StartNew;
// draw 1000 random lines
for I := 1 to cLineCount do
begin
p1.Create(Random*Canvas.Width,Random*Canvas.Height);
p2.Create(Random*Canvas.Width,Random*Canvas.Height);
Canvas.DrawLine(p1,p2,0.5);
end;
Canvas.EndScene;
sw.Stop;
Memo1.Lines.Add(Format('%f'#9'%d', [Canvas.StrokeThickness, Round(sw.ElapsedTicks / cLineCount)]));
end;
Clipboard.AsText := Memo1.Text;
end;
Обновление
@Steve Wellens: Действительно, вертикальные линии и горизонтальные линии намного быстрее. На самом деле разница между горизонтальными и вертикальными:
Диагональные линии: синий, горизонтальные линии: зеленый, вертикальные линии: красный
С вертикальными линиями наблюдается резкое различие между линиями шириной менее 1 пикселя. С диагональными линиями есть наклон между 1.0 и 1.5.
Странная вещь заключается в том, что практически нет разницы между рисованием горизонтальной линии 1 пикселя и картированием одного из 20 пикселей. Я думаю, это то, где аппаратное ускорение начинает меняться?