gpt4 book ai didi

Android 位图对象作为绘制缓冲区

转载 作者:太空狗 更新时间:2023-10-29 12:41:25 24 4
gpt4 key购买 nike

设置:我已经实现了一种 native (读取 JNI)机制来将像素从 Bitmap 对象复制到 native 内存。这是通过 native 内存中的 malloc() uint23_t array 完成的,然后使用 memcpy() 将像素复制到位图的 native 指针或从 native 指针复制像素。这很好用并且已经过测试。像素从 Bitmap 对象成功保存在 native 内存中,并复制回 Bitmap 对象,并在屏幕上可见。它的复制速度非常快,对于相当大的位图,复制速度可达几毫秒。但渲染速度极慢。

Intent :上面的操作是为了打破默认 android Bitmaps 的堆限制(引用 https://stackoverflow.com/a/1949205/1531054 )。只有 1 个 Java Bitmap 对象充当 native 内存和目标 Canvas 之间的缓冲区。

保存形状:

  1. 清除缓冲区位图。
  2. 在位图上绘制形状。
  3. 将像素复制到 native 内存,并保存内存指针。
  4. 清除缓冲区位图。

因此,可以将任意数量的形状保存到 native 内存中,而不会遇到堆大小限制。这行得通。

稍后需要绘制形状时(比如在 onDraw() 中):

  1. 清除缓冲区位图。
  2. 使用保存的内存指针将像素从 native 内存复制到缓冲区位图。
  3. canvas 上绘制缓冲区位图。
  4. 清除缓冲区位图。
  5. 再次重复下一个形状。

问题 当从内存中快速绘制许多形状时,缓冲区 Bitmap 有点滞后。基本上我们在做

clear bitmap -> load pixels from memory onto it -> draw it on view canvas

onDraw() 中的快速连续中,只有最新形状的像素被绘制到 Canvas 上。看起来好像:

  1. 内部 canvas.drawBitmap() 是异步的,有时会稍后从位图中复制像素。
  2. Android 的位图 有一些隐藏的缓存机制。

有没有人遇到过这样的麻烦?或者对此有一些见解?

我知道可以在 JNI 中获取 native skia lib 的 Canvas 实例并在其上绘制,但这是一种非标准方式。

最佳答案

在最近的 Android 版本(3.0 及更高版本,这是大多数设备)中,像素使用常规的 Java 内存堆。随着硬件加速的引入,位图被异步绘制,并且有一个缓存系统来管理作为纹理加载到 GPU 的位图。因此,您尝试进行的黑客攻击可能会降低新设备的性能。如果您需要更多内存,请尝试在您的 list 中使用 largeHeap="true"。

关于Android 位图对象作为绘制缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25182134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com