我正在使用renderscript进行实时图像处理(相机预览)。我在Nexus 6 Marshmallow 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);
}
答案 0 :(得分:0)
您是否可以仔细检查您正在写入的图像是否未查看Alpha通道或尝试明确设置它。 (这更像是评论,但我没有足够的分数)
答案 1 :(得分:0)
经过相当多的研究后,我认为这很可能是GPU驱动程序的问题。话虽如此,我上面提到过,我尝试删除似乎暂时解决问题的#pragma rs_fp_relaxed
。我现在相信这是一个赌博,选择fp
精确RS正在使用,这就是它有时工作的原因,有时不是。当我明确设置#pragma rs_fp_full
似乎永久修复了问题时,我得出了这个结论,因为它与native
函数一起应该是硬件支持的计算(到目前为止适用于导致问题的所有脚本)关于Nexus 6)。
我在网上发现了一些案例,人们通过刷新新驱动程序来解决RS问题,但这对我来说是不可接受的。
回顾一下:我明确设置了#pragma rs_fp_full
。