Почему рисование линии толщиной менее 1,5 пикселей в два раза медленнее рисования линии толщиной 10 пикселей?

Я просто играю с FireMonkey, чтобы увидеть, работает ли графическая отрисовка быстрее, чем GDI или Graphics32 (моя любимая библиотека на данный момент ).

Чтобы узнать, насколько быстро это работает, я провел несколько тестов, но обнаружил странное поведение:

Рисование тонких линий (<1,5 пикселя в ширину) кажется очень медленным по сравнению с более толстыми линиями: Performance

  • Вертикальные ось: тики ЦП для рисования 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: Действительно, вертикальные и горизонтальные линии намного быстрее. На самом деле существует разница между горизонтальными и вертикальными линиями:

Difference between Diagonal, Horitonzal and Vertical lines Диагональные линии: синие, Горизонтальные линии: зеленые, Вертикальные линии: красные

С вертикальными линиями существует резкая разница между линиями шириной менее 1 пикселя. Для диагональных линий угол наклона составляет от 1,0 до 1,5.

Странно то, что нет никакой разницы между рисованием горизонтальной линии в 1 пиксель и рисованием одной из 20 пикселей. Думаю, именно здесь аппаратное ускорение начинает иметь значение?

32
задан dthorpe 24 January 2012 в 01:46
поделиться