1

私はAndroidでのマルチスレッドイメージ処理に取り組んでいます。私は明確にできない問題に直面しています。Androidでのマルチスレッドの問題

一部の携帯電話では、古いものでも、まともなタイミングが得られますが、それ以上のものには許容できないものがあります。

enter image description here

一部コード:

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()をパスごとに複数回実行します。

OSに問題がありますか(「faulty」デバイスはどちらも6.xにあります)ですか?

ご協力いただきありがとうございます。

+1

私は専門家ではありませんが、メモリに関連する原因かもしれません。すべての変更は、通常、大量のメモリを必要とする新しいビットマップを作成しています。 –

+0

スレッドがビットマップの同じ部分で動作しないように見えるので、複数のコピーを必要としないかもしれません。 –

+0

私は各スレッドにソースビットマップのほんの一部を提供します。しかし、私はこの想像上のメモリ問題をWiko Darkmoonで苦しんでいませんか? – Xalamadrax

答えて

0

それは

は(x、y)ととsetPixel(x、y)は、パスごとに複数回の実行がスローダウンしてgetPixelメソッドを呼び出して...結局マルチスレッドの問題ではありませんでした。 しかし、知られていない理由のために、ポストマシュマロデバイス/エミュレータではそれはより悪くなりました。

int[width * height]配列のgetPixels()/ setPixels()を使用することは非常に効率的です。 ここでは秒単位ではなくミリ秒単位で話しています。

関連する問題