设置:
我已经实现了一种本地(即JNI)机制,用于从Bitmap
对象复制像素到本地内存。这是通过在本地内存中使用malloc()
uint23_t数组
并稍后使用memcpy()
将像素从/到位图的本地指针进行的。这很有效,并且已经过测试。成功地将像素保存在本地内存中,从Bitmap
对象中复制回来,并在屏幕上可见。它在复制方面非常快,对于相当大的位图,速度高达几毫秒的级别。但在渲染方面极慢。
意图:
以上内容是为了摆脱默认Android Bitmaps
的堆限制而完成的(请参阅https://dev59.com/dHI-5IYBdhLWcg3wQV8Z#1949205)。只会有1个Java Bitmap
对象在本地内存和目标画布之间充当缓冲区。
保存形状:
- 清除缓冲区位图。
- 在位图上绘制形状。
- 将像素复制到本地内存并保存内存指针。
- 清除缓冲区位图。
因此,可以将任意数量的形状保存到本地内存中,而不会遇到堆大小限制。这有效。
稍后需要绘制形状时(例如在onDraw()
中):
- 清除缓冲区位图。
- 使用保存的内存指针从本地内存复制像素到缓冲区位图。
- 在
canvas
上绘制缓冲区位图。 - 清除缓冲区位图。
- 为下一个形状重复以上步骤。
问题:当快速从内存中绘制许多形状时,缓冲区Bitmap
会有点卡顿。基本上我们正在做的是
clear bitmap -> load pixels from memory onto it -> draw it on view canvas
在
onDraw()
中,快速连续地绘制形状时,只有最新的形状像素被绘制到画布上。看起来好像有以下两种情况:
canvas.drawBitmap()
是异步的,有时会稍后从位图中复制像素。- Android的
Bitmaps
有一些隐藏的缓存机制。
我知道可以在JNI中获取本地skia lib的画布实例并在其上进行绘制,但这是一种非标准的方式。