我正在尝试使用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?
答案 0 :(得分:2)
Windows上的Firemonkey画布可能没有使用GPU。如果您使用XE6,可以
在初始化部分将全局变量FMX.Types.GlobalUseGPUCanvas设置为true。
否则,在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置于高性能以避免抗锯齿,但我没有看到它真的改变速度。