我想在我的Android应用程序中处理位图 - 位图可能很大,所以我使用多线程来执行更快的操作。这是我的代码(Runnable孩子的一部分):
{{1}}
当我在池中只使用一个线程时,一切都会正常工作。不幸的是,当我使用的线程数等于处理器的核心数(我的设备中有4个)时,结果如下(对于灰度滤波器):
有时看起来像是:
我是对的吗?这些函数是否是线程不安全的?我应该如何执行多线程位图过滤以实现快速且线程安全?
答案 0 :(得分:4)
Android中的2D图像处理由Skia库提供,也可由Chrome使用。
很难找到明确的答案。 “Skia不是线程安全的,虽然SkBitmap [Bitmap使用] 是线程安全的......”我不知道该怎么想。我仔细阅读了一堆难以理解的JNI / C ++代码,这是我能提供的最好的代码(这似乎比其他任何人都能做的更多):
我认为您应该在整个位图上调用bitmap.getPixels()
。然后划分结果数组并线程化处理。完成所有线程后,重新组合结果并调用bitmap.setPixels()
似乎bitmap.getPixels()
和bitmap.setPixels()
应该只是memcpy()
s,但还有更多内容涉及引用计数,图像缓存,色彩空间转换,预乘和谁知道还有什么。将Bitmap
方法排除在并发处理之外应该可以避免麻烦。