我正在使用renderscript进行实时图像处理(相机预览)。我在Nexus6Marshmall6.1上遇到了一个问题,我的一些脚本只能运行几个框架(rs内核运行)。同样的脚本在Nexus4Lollipop5.1上运行得完美无缺。
症状:脚本可以多次运行(构建)。在第n次运行时,一些脚本按照预期停止工作,随后的所有运行都显示了上述问题。我还无法在代码中建立一些特定的操作,从而导致问题的发生。它看起来完全是随机的,至少从我能收集到的资料来看。
尝试过的是:
rsDebug():
RenderScript code not working without 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);
}发布于 2016-03-14 14:04:47
经过相当多的研究,我认为这很可能是GPU驱动程序的问题。尽管如此,我在上面提到,我尝试删除#pragma rs_fp_relaxed,因为它似乎暂时解决了这个问题。我现在相信,这是一场赌博,选择fp精度的RS正在使用,这就是为什么它有时起作用,有时不起作用。当我显式地设置#pragma rs_fp_full时,我得出了这个结论,它似乎永久地解决了这个问题,因为它连同native函数应该是一个硬件支持的计算(到目前为止,它适用于所有在Nexus 6上造成问题的脚本)。
我在网上发现了一些通过闪动新驱动程序来解决RS问题的案例,但这对我来说是不可接受的。
回顾一下:我显式地设置了#pragma rs_fp_full。
发布于 2016-03-11 01:26:56
您是否可以再次检查您正在写入的图像,而不是查看alpha通道,或者尝试显式设置它。(这是一个更多的评论,但我没有足够的观点)
https://stackoverflow.com/questions/35918600
复制相似问题