【问题标题】:Multithreading issues on AndroidAndroid上的多线程问题
【发布时间】: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


【解决方案1】:

毕竟不是多线程问题...

每次通过多次调用 getPixel(x, y) 和 setPixel(x, y) 会减慢执行速度。 但是,由于未知原因,在 Marshmallow 后的设备/模拟器上情况更糟。

int[width * height] 数组中使用 getPixels() / setPixels() 现在效率大大提高。 我们现在说的是毫秒,而不是秒。

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多