Setup:
I have implemented a native (read JNI) mechanism to copy pixels from a Bitmap
object, to native memory. This is done by malloc()
uint23_t array
in native memory and later using memcpy()
to copy pixels to/from Bitmap's native pointer. This works well and have been tested. Pixels are successfully saved in native memory from a Bitmap
object, and copied back to a Bitmap
object, and visible on screen. Its pretty fast in copying, up to order of several milliseconds for fairly large bitmaps. But extremely slow in rendering it.
Intention:
The above was done to break free of heap limit on default android Bitmaps
(refer to https://stackoverflow.com/a/1949205/1531054). There would be only 1 Java Bitmap
object acting as buffer between native memory and target canvas.
Save a shape:
- clear Buffer Bitmap.
- Draw shape on Bitmap.
- Copy pixels to native memory, and save the memory pointer.
- Clear Buffer Bitmap.
So, any number of shapes can be saved to native memory, without running into heap size limits. This works.
Later when need to draw a shape (say in onDraw()
):
- clear Buffer Bitmap.
- Copy pixels from native memory, to Buffer Bitmap, using the saved memory pointer.
- Draw Buffer Bitmap on
canvas
. - Clear Buffer Bitmap.
- Repeat again for next shape.
Problem When quickly drawing many shapes from memory, The Buffer Bitmap
sorts of lags. Basically we're doing
clear bitmap -> load pixels from memory onto it -> draw it on view canvas
in Quick succession inside onDraw()
, only the latest shape's pixels are drawn onto canvas. It appears as if:
- The internal
canvas.drawBitmap()
is asynchronous and copies pixels off the bitmap later sometimes. - Android's
Bitmaps
have some hidden caching mechanism.
Has anyone run into such trouble before ? Or has some insight regarding this ?
I know one can get native skia lib's canvas instance in JNI and draw on it, but this is a non standard way.