[英]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.