Я просто играю с FireMonkey, чтобы увидеть, работает ли графическая отрисовка быстрее, чем GDI или Graphics32 (моя любимая библиотека на данный момент ).
Чтобы узнать, насколько быстро это работает, я провел несколько тестов, но обнаружил странное поведение:
Рисование тонких линий (<1,5 пикселя в ширину) кажется очень медленным по сравнению с более толстыми линиями:
Результаты довольно стабильны; рисование всегда становится намного быстрее, если толщина линии превышает 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 пикселей. Думаю, именно здесь аппаратное ускорение начинает иметь значение?