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()每次傳遞幾次。

它是一個設備相關的問題,操作系統之一(因爲'錯誤'設備都在6.x)?

任何幫助表示讚賞,謝謝。

+1

我不是專家,但可能是內存相關的原因。每創建一個新的位圖,通常需要大量的內存。 –

+0

也看起來像線程不會在位圖的相同部分上運行,所以也許你不需要它的多個副本? –

+0

我爲每個線程提供一小部分源位圖。但是我不會因爲這個Wiko Darkmoon的記憶問題而受苦嗎? – Xalamadrax

回答

0

這不是一個多線程問題,畢竟......

調用getPixel(X,Y)和setPixel(X,Y)每通過多次被減慢執行。 但是,由於未知原因,在棉花糖後裝置/仿真器上情況更糟。

int[width * height]數組中使用from /的getPixels()/ setPixels()現在非常有效。 我們現在用毫秒來說話,而不是幾秒鐘。