Delphi FireMonkey Canvas性能问题

我正在尝试使用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,而是100 000甚至毫升矩形(我的PC肯定是GTX 660 Ti)(假设至少25 FPS,所以在大约40毫秒内),但是我可以通过FireMonkey实现这一点,即使Delphi创建者吹嘘它是快速的夜晚和GPU加速.如果我用圆形替换矩形(FillArc方法),当我绘制100个圆圈时,大约需要10 000个矩形.与输出字母(单字幕文本)相同.我究竟做错了什么?我看不出有什么错误吗?或者只是FireMonkey的问题?还是很正常的?

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

最佳答案 Windows上的Firemonkey画布可能没有使用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)

点赞