[英]Renderscript image processign Nexus 6 Marshmallow issue
我正在使用renderscript進行實時圖像處理(相機預覽)。 我在Nexus 6棉花糖6.1上遇到問題,我的某些腳本無法運行超過兩幀(rs內核運行)。 這些相同的腳本可以在Nexus 4 Lollipop 5.1上完美運行。
症狀:腳本可以運行幾次(構建)。 在第n次運行中,某些腳本會按預期停止運行,並且所有后續運行均出現上述問題。 我無法在導致問題的代碼中建立某些特定的操作。 看來是完全隨機的,至少從我的收集中可以看出。
我嘗試過的是:
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.