1

我使用 Delphi 10.3 和 .Net 5.0。我知道 tCanvas 是 GDI,Graphics 是 GDI+,它的表现优于前者。但在以下简单代码中,tCanvas 更快。Delphi 的 5 倍平均毫秒数是 185.00,.Net 是 351.20。

为什么 tCanvas 比 Graphics 快,或者我的代码有什么缺陷?

德尔福

procedure TForm1.PaintBox1Click(Sender: TObject);
var
  _Rectangle: TRect;
  _Rectangles: TList<TRect>;
  _Stopwatch: TStopwatch;
  i: Integer;
begin
  PaintBox1.Canvas.Brush.Color := clWhite;

  _Rectangle.Left := 0;
  _Rectangle.Top := 0;
  _Rectangle.Width := PaintBox1.Width;
  _Rectangle.Height := PaintBox1.Height;

  PaintBox1.Canvas.FillRect(_Rectangle);

  _Rectangles := TList<TRect>.Create;

  for i := 0 to 9999 do
  begin
    _Rectangle.Left := Random(1000);
    _Rectangle.Top := Random(1000);
    _Rectangle.Right := _Rectangle.Left + 5;
    _Rectangle.Bottom := _Rectangle.Top + 5;

    _Rectangles.Add(_Rectangle);
  end;

  PaintBox1.Canvas.Brush.Color := clBlack;

  _Stopwatch := TStopwatch.StartNew;

  for i := 0 to 9999 do
  begin
    PaintBox1.Canvas.FillRect(_Rectangles.List[i]);
  end;

  Caption := IntToStr(_Stopwatch.ElapsedMilliseconds);

  _Rectangles.Free;
end;

。网

private void panel1_Click(object sender, EventArgs e)
{
    Graphics _Graphics = panel1.CreateGraphics();
    List<Rectangle> _Rectangles = new();
    Random _Random = new();
    Rectangle _Rectangle = new(0, 0, panel1.Width, panel1.Height);
    SolidBrush _SolidBrush = new(Color.White);

    _Graphics.FillRectangle(_SolidBrush, _Rectangle);

    for (int i = 0; i < 10000; i++)
    {
        _Rectangle = new(_Random.Next(1000), _Random.Next(1000), 5, 5);

        _Rectangles.Add(_Rectangle);
    }

    _SolidBrush.Color = Color.Black;

    Stopwatch _Stopwatch = new();

    _Stopwatch.Start();

    foreach (var item in _Rectangles)
    {
        _Graphics.FillRectangle(_SolidBrush, item);
    }

    Text = _Stopwatch.ElapsedMilliseconds.ToString();

    _Graphics.Dispose();
    _SolidBrush.Dispose();
}
4

1 回答 1

1

按照 David 的建议,使用 Bitmap 将性能提高到 48.2 毫秒。

private void button1_Click(object sender, EventArgs e)
{
    Bitmap _Bitmap = new(1000, 1000);

    Graphics _BitmapGraphics = Graphics.FromImage(_Bitmap);
    Graphics _PanelGraphics = panel1.CreateGraphics();
    List<Rectangle> _Rectangles = new();
    Rectangle _Rectangle;
    Random _Random = new();
    SolidBrush _SolidBrush = new(Color.Black);

    _BitmapGraphics.Clear(Color.White);

    for (int i = 0; i < 10000; i++)
    {
        _Rectangle = new(_Random.Next(1000), _Random.Next(1000), 5, 5);

        _Rectangles.Add(_Rectangle);
    }

    Stopwatch _Stopwatch = new();

    _Stopwatch.Start();

    foreach (var item in _Rectangles)
    {
        _BitmapGraphics.FillRectangle(_SolidBrush, item);
    }

    _PanelGraphics.DrawImage(_Bitmap, Point.Empty);
        
    button1.Text = _Stopwatch.ElapsedMilliseconds.ToString();

    _Bitmap.Dispose();
    _BitmapGraphics.Dispose();
    _PanelGraphics.Dispose();
    _SolidBrush.Dispose();
}
于 2021-07-11T07:58:18.263 回答