【问题标题】:on delphi/android how to draw a TbitmapSurface on a Canvas?在 delphi/android 上如何在 Canvas 上绘制 TbitmapSurface?
【发布时间】:2016-01-04 12:28:01
【问题描述】:

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

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

  1. 必须在主线程内完成(我不知道为什么会出现黑屏)
  2. 运行速度比较慢

【问题讨论】:

    标签: android delphi graphics bitmap firemonkey


    【解决方案1】:

    我不为 Android 使用/编码,所以带着极大的偏见阅读。由于 Delphi 使用 VCL,所以我坚持使用它。如果Android下的Delphi没有,那么你可以忽略这个答案。

    在访问任何 OS 视觉内容(无论是通过 GDI 还是 WinAPI) 来自外部主线程将使 OS API 失效,从而导致奇怪的事情发生,例如随机崩溃、错误渲染等。另一个原因可能是使用 GPU通常绑定到进程/线程和设备上下文的相关调用。因此,为了使其线程安全,如果可能的话,您可能必须创建共享上下文,否则您需要坚持使用主线程。

    通过Assign,您正在创建新图像并将旧图像复制到其中,这与绘制本身所花费的时间相当,更不用说在内存慢的设备上它确实可以大大减慢整个过程。

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

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

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

    请参阅 Display an array of color in C 部分 GDIGDI 位图 了解 VCL

    下的一些想法

    【讨论】:

    • 不幸的是,无法进行 blablabla->Canvas->Draw(x,y,aBitmapSurface);我必须首先在 TTexture 中转换 aBitmapSurface ,这很慢,因为它必须从主线程完成:(
    • @lok​​i 如果与 VCL 不完全兼容,请尝试使用 VCL 中的 Graphics::TBitmap 而不是 TbitmapSurface
    • @lok​​i 没有 VCL 的东西,但是如果您在自己的数组中获得 ScanLine[] 指针,那么您可以快速访问多线程安全像素
    • 不确定通过像素阵列绘制到画布是否会很快 enalf :( 我会先尝试 :)
    • @lok​​i 我用我的多光谱渲染引擎将它用于多线程软件 3D 背光追踪,所以如果编码正确,它就足够快了。但粗略的无法与 GPU 上的板载几何渲染相媲美。诀窍是在调整 TBitmap 大小后仅读取一次ScanLine[],然后仅使用您自己的指针数组变量...
    【解决方案2】:

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

    bmp.Assign(surf);
    

    然后将Bitmap绘制到画布上:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多