我正在开发一个 Android 应用程序,该应用程序在共享内存缓冲区上处理本机代码中的图形操作。我已经创建了使用 JNI 从 Java 调用我的本机代码的函数,我的本机代码使用 JNI API 从本机代码调用 Java。由于复制大型像素数组对性能有显着影响,因此我需要尽可能避免它。
Bitmap 类的 Android 文档讨论了将像素复制到 Bitmap 内部缓冲区的两种方法:http: //developer.android.com/reference/android/graphics/Bitmap.html
setPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height) 用数组中的颜色替换位图中的像素。
copyPixelsFromBuffer(Buffer src) 从缓冲区复制像素,从当前位置开始,覆盖位图的像素。
API 文档的问题在于,当您使用这些函数时,对于幕后发生的事情非常模糊。但是,在某处提到 copyPixelsFromBuffer() 直接复制像素而无需任何内部颜色格式转换,而 setPixels() 则在所有情况下都会进行该转换,即使原始像素采用目标像素格式也是如此。显然,这不是我想要的,因为我缓冲区中的像素已经处于良好的格式。
现在, copyPixelsFromBuffer() 看起来非常好,因为它不会进行那种转换,但是文档没有讨论如何将像素从缓冲区复制到目标位图中的特定偏移量。糟糕,这很重要,因为我不想每次都复制整个缓冲区,而只想复制一个区域。是的,文档说它将从源缓冲区中的当前位置复制,但没有提到目标缓冲区。SetPixels() 进行不必要的转换,但允许您在目标缓冲区中指定偏移量。
所以,我被困在:
以像素转换为代价仅复制我想要的区域
或者
以每次复制整个缓冲区为代价避免像素转换
为了得到一个想法,我可能有一个表示 1024x768 屏幕的缓冲区,其中有一个从 (300,300) 到 (400,400) 的无效区域。
如果我只复制需要更新的区域,我可以复制并转换 100*100 像素或复制而不转换 1024*768 像素。100x100 的无效区域很小,仅在特定情况下,大多数无效区域将占用缓冲区的更大部分。这两种方法对性能都有非常负面的影响。
有没有人知道如何将像素从缓冲区复制到目标缓冲区上的特定偏移量,而无需强制像素转换?这将是两全其美,我不明白为什么它似乎不可用。
非常感谢你的帮助