簡體   English   中英

Renderscript Image Processign Nexus 6棉花糖問題

[英]Renderscript image processign Nexus 6 Marshmallow issue

我正在使用renderscript進行實時圖像處理(相機預覽)。 我在Nexus 6棉花糖6.1上遇到問題,我的某些腳本無法運行超過兩幀(rs內核運行)。 這些相同的腳本可以在Nexus 4 Lollipop 5.1上完美運行。

症狀:腳本可以運行幾次(構建)。 在第n次運行中,某些腳本會按預期停止運行,並且所有后續運行均出現上述問題。 我無法在導致問題的代碼中建立某些特定的操作。 看來是完全隨機的,至少從我的收集中可以看出。

我嘗試過的是:

  • 重新啟動手機,卸載應用程序,清理項目,使Android Studio中的緩存無效均不會產生任何結果。
  • 每個帖子添加rsDebug()
    RenderScript代碼在沒有rsDebug的情況下無法正常工作,似乎已解決了該問題,但是經過幾次構建后,問題再次出現。
  • 在代碼中添加rsDebug()並實際記錄日志似乎可以按預期運行腳本,但是不用說,這不是解決方案,因為它會使腳本減速到停止狀態。
  • 刪除#pragma rs_fp_relaxed似乎已解決了該問題,但經過幾次構建后,問題再次出現。
  • adb shell setprop debug.rs.default-CPU-driver 1解決了該問題,但是使用renderscript的全部目的是利用異構計算

我正在使用此內核簽名uchar4 __attribute__((kernel)) filter(uchar4 v_in, uint32_t x, uint32_t y) ,盡管RS_KERNEL會引起相同的問題。

感謝您的幫助和想法。

受影響的代碼示例:(來自此處的Google演示代碼: https : //android.googlesource.com/platform/frameworks/rs/+/master/java/tests/ImageProcessing2/src/com/android/rs/image/

static float sr = 0.f;
static float sg = 0.f;
static float sb = 0.f;

void prepareBwFilter(uint32_t rw, uint32_t gw, uint32_t bw) {

    sr = rw;
    sg = gw;
    sb = bw;

    float imageMin = min(sg,sb);
    imageMin = fmin(sr,imageMin);
    float imageMax = max(sg,sb);
    imageMax = fmax(sr,imageMax);
    float avg = (imageMin + imageMax)/2;
    sb /= avg;
    sg /= avg;
    sr /= avg;

}

void bwFilterKernel(const uchar4 *in, uchar4 *out) {
    float r = in->r * sr;
    float g = in->g * sg;
    float b = in->b * sb;
    float localMin, localMax, avg;
    localMin = fmin(g,b);
    localMin = fmin(r,localMin);
    localMax = fmax(g,b);
    localMax = fmax(r,localMax);
    avg = (localMin+localMax) * 0.5f;
    out->r = out->g = out->b = rsClamp(avg, 0, 255);
}

您能否再次檢查正在寫入的圖像而不是在Alpha通道中查看或嘗試對其進行顯式設置。 (這更多是評論,但我的觀點不夠多)

經過大量研究,我認為這很可能是GPU驅動程序問題。 話雖如此,我在上面提到我嘗試刪除似乎暫時解決了該問題的#pragma rs_fp_relaxed 我現在認為,選擇RS使用fp precision是一場賭博,這就是它有時起作用而有時不起作用的原因。 當我顯式設置#pragma rs_fp_full時,我得出了這個結論,由於它與native函數一起應該是硬件支持的計算,因此似乎永久地解決了該問題(到目前為止,所有在Nexus 6上引起問題的腳本都可以使用)。

我在網上發現了一些案例,人們通過刷新新驅動程序解決了RS問題,但這對我來說是不可接受的。

回顧一下:我顯式設置了#pragma rs_fp_full

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM