【发布时间】:2021-09-20 13:08:27
【问题描述】:
我使用 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;
.Net
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();
}
【问题讨论】:
-
考虑迁移到 Direct2D。
-
看VCL,其实还有FMX框架!
-
@AndreasRejbrand 哇。 delphi direct2d 代码显示 13.4 毫秒。但在 .net 中使用似乎很糟糕。
-
绘制到屏幕外位图,然后将其推送到屏幕上
-
我的经验是,VCL 封装的 GDI(来自 BCB 的 TCanvas)通常比 MSVC++ 中的相同编码更快,尤其是对于位图上的直接像素访问(使用
TScanLine),.Net也更慢平均不只是用于渲染......如果你需要真正的速度使用OpenGL ... You can easily combine VCL components with OpenGL(我的意思是按钮,东西仍然有效)......
标签: .net delphi graphics tcanvas