在delphi / android上如何在Canvas上绘制TbitmapSurface?

时间:2016-01-04 12:28:02

标签: android delphi graphics bitmap firemonkey

在delphi下(和firemonkey / android下),TcanmapSurface在Tcanvas上绘制的最快方法是什么?

我尝试使用像MyTexture.Assign(aBitmapSurface)这样的TTexture,然后使用TCustomCanvasGpu(Canvas).DrawTexture,但MyTexture.Assign(aBitmapSurface)有2个主要缺点:

  1. 必须在主线程内完成(我不知道为什么我们还有黑屏)
  2. 操作相对较慢

2 个答案:

答案 0 :(得分:0)

我没有使用Android的代码,所以阅读时带有极端的偏见。由于 Delphi 使用 VCL 所以我坚持下去。如果 Android 下的 Delphi 没有,那么您可以忽略此答案。

在访问任何操作系统视觉资料时看起来与 Windows 类似的问题(如果通过 GDI 无关紧要来自外部主线程的WinAPI )将使 OS API 无效,使得后来崩溃,错误呈现等奇怪的事情。另一个原因可能是使用 GPU 通常绑定到进程/线程和设备上下文的相关调用。因此,为了使线程安全,如果可能的话,你可能必须创建共享上下文,如果不是你需要坚持主线程。

通过Assign你正在创建新的图像并将旧图像复制到它,这需要时间与绘图本身相当,更不用说在具有慢速内存的设备上它可以真正减慢整个事情的重要性。

如果您正在处理 VCL 图形组件,请尝试直接使用Draw

  • blablabla->Canvas->Draw(x,y,aBitmapSurface);

如果blablablaaBitmapSurface是有效的gfx组件,那么它应该有效。正如我所提到的,不确定这是否也存在于Android中。 x,y是您要绘制aBitmapSurface的位置。如果您需要重新缩放,还有StretchDraw,但速度稍慢。

有关 VCL

下的一些提示,请参阅Display an array of color in C部分 GDI GDI位图

答案 1 :(得分:0)

TBitmapSurface位于系统内存中,因此您需要先将TBitmapSurface分配给TBitmap,然后转换为FMX用于绘制的本机OS位图(或纹理)格式:

bmp.Assign(surf);

然后将位图绘制到画布上

canvas.BeginScene();
canvas.DrawBitmap(bmp, SrcRect, DstRect, AOpacity);
canvas.EndScene();

我已经在Windows和Android上对其进行了测试。在android上,您还需要调用Repaint来查看更改。