Delphi 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不同)

  • 但是我认为这两种设备在一帧内(假设至少25 FPS,因此在大约40毫秒内)应该能够画出不是10000,而是100 000,甚至是数百万的直方图(我的PC配GTX 660 Ti)但我可以通过FireMonkey实现这一点,即使在Delphi创建者吹嘘它是光速快并且GPU加速的情况下也是如此。 如果我用圆圈代替矩形(FillArc方法),当我绘制100个圆圈时,大约与10000个矩形的时间相同。 与输出字母(单个字符文本)相同。 我究竟做错了什么? 我看不到有什么错误吗? 或者它只是FireMonkey的问题? 或者这是正常的?

    当我需要保持与Windows和Android的兼容性时,我应该选择另一种比Canvas更快的绘图方式?


    Windows上的Firemonkey画布可能不使用GPU。 如果你使用XE6,你可以

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

    文档

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

    另一种选择可能是有一个OpenGL画布单元

    你也可以并行处理你的循环,但它们只会让你的测试更快,也许不是你真实世界的游戏(Delphi中的并行循环)


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

    链接地址: http://www.djcxy.com/p/96699.html

    上一篇: Delphi FireMonkey Canvas performance issues

    下一篇: FireMonkey XE5 Icons for iOS app