Delphi FireMonkey Canvas 性能问题

标签 delphi canvas firemonkey

我正在尝试使用 FireMonkey 在 Delphi XE5/XE6 中制作 2D 游戏,并且我需要保持多平台性 - 我需要 Windows 和 Android 构建。目前,游戏只是用直线、圆形、矩形或其他多边形绘制,我使用 Canvas(整个屏幕上的 TPaintBox 和 OnPaint 事件来绘制)。问题是,我认为即使 FireMonkey 应该使用 GPU 加速,性能也非常低。我做了这个性能测试,在随机 XY 位置上绘制 1000 个矩形:

procedure Paint(Canvas: TCanvas);
var
  I: Integer;
  X, Y: Single;
begin
  Canvas.BeginScene;
  Canvas.Clear($ffffffff);

  Canvas.Fill.Color := $ffff0000;
  for I := 0 to 10000 do begin
    X := Random(500);
    Y := Random(400);
    Canvas.FillRect(TRectF.Create(X, Y, X + 20, Y + 20), 0, 0, [], 1);
  end;

  Canvas.EndScene;
end;

我通过这个函数测量了方法,得到了这些结果:

  • Windows PC - Core2Duo 3.2GHz、GeForce 660Ti - 对于如此简单的任务来说相当强大 - 花了 20 毫秒

  • Android 手机 - HTC One X(4 核,1 GHz,Tegra 3 CPU/GPU) - 需要 50-60 milisends(与 PC 相比没有那么大的差异,正如我想象的那样) )

但是,我认为这两种设备应该能够在一帧中绘制不是 10 000 个,而是 100 000 个,甚至数百万个矩形(我的电脑肯定是 GTX 660 Ti)(假设至少 25 FPS,因此大约 40毫秒),但我可以用 FireMonkey 达到这个目标,即使 Delphi 的创建者吹嘘它速度快如闪电并且 GPU 加速。如果我用圆形替换矩形(FillArc 方法),当我绘制 100 个圆形时,大约需要与 10 000 个矩形相同的时间。与输出字母(单字 rune 本)相同。我究竟做错了什么?有什么我看不到的错误吗?或者这只是 FireMonkey 的问题?还是说这很正常?

当我需要保持与 Windows 和 Android 的兼容性时,除了 Canvas 之外,我还应该选择什么方式来快速绘图?

最佳答案

Windows 上的 Firemonkey Canvas 可能不使用 GPU。如果您使用的是 XE6,您可以

set the global variable FMX.Types.GlobalUseGPUCanvas to true in the initialization section.

Documentation

否则,在 XE5 中,请在窗体上粘贴 TViewPort3D。将 TLayer3D 粘贴到 TViewPort3D 中,并将其 Projection 属性更改为 pjScreen。将 TPaintBox 粘贴到 TLayer3D 上。

另一种选择可能是 OpenGL canvas unit

您也可以并行处理您的循环,但它们只会使您的测试更快,而可能不是您的现实世界游戏( Parallel loop in Delphi )

关于Delphi FireMonkey Canvas 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23599945/

相关文章:

delphi - HasValidFileNameChars 对于 UNC 文件失败

javascript - 如何在没有 Canvas 的 Node.js 中生成 QR 图像?

javascript - 围绕圆创建径向渐变描边

delphi - 是否可以在 TDateEdit Firemonkey 控件上指定最短日期?

delphi - 如何在其他组件后面显示视频?

delphi - FMX Delphi 中任务栏后面显示的弹出菜单

delphi - 如何在delphi中调整麦克风输入电平?

delphi - Delphi中的 "customizable VCL designer guideline"是什么?

delphi - 在 Delphi 中销毁表单的正确方法是什么?

delphi - 对角画笔样式给我黑色区域