我正在 Android 上进行多线程图像处理,但我遇到了一个我无法澄清的问题。
在一些手机上,甚至是旧手机上,我得到了一些不错的计时,而在较新的手机上,我得到了一些 Not Acceptable 计时。
一些代码:
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) 并在给定偏移量上移动红色和蓝色 channel 。因此,每次通过多次 getPixels() 和 setPixels()。
这是一个设备相关的问题,一个操作系统问题(因为两个“故障”设备都在 6.x 中)?
感谢任何帮助,谢谢。
最佳答案
毕竟这不是多线程问题...
每次传递多次调用 getPixel(x, y) 和 setPixel(x, y) 会减慢执行速度。 但是,出于未知原因,在后期 Marshmallow 设备/模拟器上情况更糟。
在 int[width * height]
数组中使用 getPixels()/setPixels() 现在效率大大提高。
我们现在说的是毫秒,而不是秒。
关于android - Android 上的多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42441530/