Delphi FireMonkey Canvas性能问题

时间:2014-05-12 01:52:37

标签: 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毫秒(与我认为没有那么大的差异对PC )

然而,我认为两个设备应该能够在一个帧中绘制不是10 000,而是10万,甚至是毫升矩形(我的PC,确保GTX 660 Ti)(假设至少25 FPS,所以大约40毫秒),但是我可以使用FireMonkey实现这一点,即使Delphi创建者吹嘘它是快速的夜晚和GPU加速。如果我用圆形替换矩形(FillArc方法),当我绘制100个圆圈时,大约需要10 000个矩形。与输出字母(单字幕文本)相同。我究竟做错了什么?我有什么不对的错吗?或者只是FireMonkey的问题?或者这是正常的?

当我需要保持与Windows和Android的兼容性时,我应该选择哪种方式来快速绘制Canvas?

2 个答案:

答案 0 :(得分:2)

Windows上的Firemonkey画布可能没有使用GPU。如果您使用XE6,可以

  

在初始化部分将全局变量FMX.Types.GlobalUseGPUCanvas设置为true。

Documentation

否则,在XE5中,在你的表格上粘贴一个TViewPort3D。将TLayer3D粘贴在TViewPort3D中并将其更改为Projection属性为pjScreen。将您的TPaintBox粘贴在TLayer3D上。

另一种选择可能是OpenGL canvas unit

你也可以并行处理你的循环,但它们只会让你的测试更快,而不是真正的世界游戏(Parallel loop in Delphi

答案 1 :(得分:0)

当您在画布中绘制一个圆圈(即GPUCanvas)时,您实际上绘制了大约50个小三角形。这就是GPUCanvas的工作原理。对于带有圆形矩形的例如矩形,情况更糟。我还发现Canvas.BeginScene和Canvas.endScene操作非常慢。你可以尝试将form.quality置于高性能以避免抗锯齿,但我没有看到它真的改变速度。