【发布时间】:2017-07-15 10:56:51
【问题描述】:
我正在 Android 上进行多线程图像处理,但遇到了一个我无法澄清的问题。
在某些手机上,甚至是旧手机上,我得到了一些不错的时间,而在最近的手机上,我得到了一些不可接受的时间。
一些代码:
public class ShiftEffectManager implements ShiftRunnable.OnShiftRunCompleteListener {
...
public ShiftEffectManager(OnEffectAppliedListener listener, Bitmap source) {
mService = Executors.newFixedThreadPool(MAX_THREADS);
...
}
public void execute() {
...
for (int i = 0; i < MAX_THREADS; i++) {
mService.submit(new ShiftRunnable(this, getFraction(mSource, start, step), start, offsets));
}
}
private Bitmap getFraction(Bitmap source, int start, int step) {
return Bitmap.createBitmap(source, 0, start, source.getWidth(), step);
}
@UiThread
private void assembleBitmap() {
...
((Activity) mListener).runOnUiThread(new Runnable() {
@Override
public void run() {
mListener.onEffectApplied(output);
}
});
}
@Override
public void onShiftRunComplete(ShiftFractionPayload payload) {
mPayloads.add(payload);
mTaskCount++;
if (mTaskCount == MAX_THREADS) {
assembleBitmap();
}
}
}
ShiftRunnable 正在解析 1920 * (1080 / MAX_THREADS) 并在给定偏移量上移动红色和蓝色通道。因此,getPixels() 和 setPixels() 每次通过几次。
这是与设备相关的问题,还是操作系统问题(因为两个“故障”设备都在 6.x 中)?
任何帮助表示赞赏,谢谢。
【问题讨论】:
-
我不是专家,但可能与记忆有关。每次更改都会创建一个通常占用大量内存的新位图。
-
另外看起来线程不会对位图的同一部分进行操作,所以也许您不需要它的多个副本?
-
我只为每个线程提供一小部分源位图。但是我不会在 Wiko Darkmoon 上遇到这个所谓的内存问题吗?
-
在对 7.x 手机和 API 17 emu 和 API 25 emu 进行了一些广泛的测试之后,似乎后 Marshmallow 多线程,至少我这样做的方式,对操作系统不太友好.
-
post-Marshmallow multithreading, at least the way I do it。大概。我做多线程图像调整大小,它在 7.1.1 上也很快。
标签: android multithreading algorithm image-processing android-bitmap