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