0

我正在使用渲染脚本进行实时图像处理(相机预览)。我在 Nexus 6 Marshmallow 6.1 上遇到问题,我的一些脚本不会运行超过几帧(rs 内核运行)。这些相同的脚本在 Nexus 4 Lollipop 5.1 上完美运行。

症状:脚本适用于多次运行(构建)。在第 n 次运行时,某些脚本停止按预期工作,并且所有后续运行都出现上述问题。我无法在导致问题的代码中建立某些特定操作。它看起来完全是随机的,至少从我能收集到的情况来看是这样。

我试过什么:

  • 重启手机、卸载应用程序、清理项目、使 Android Studio 中的缓存无效都不会产生任何结果。
  • 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);
}
4

2 回答 2

0

您能否仔细检查您正在写入的图像是否没有查看 alpha 通道或尝试明确设置它。(这更多是评论,但我没有足够的积分)

于 2016-03-11T01:26:56.023 回答
0

经过大量研究后,我认为这很可能是 GPU 驱动程序问题。话虽如此,我在上面提到我尝试删除#pragma rs_fp_relaxed似乎暂时解决了问题的方法。我现在相信,选择fpRS 使用的精度是一场赌博,这就是它有时有效有时无效的原因。当我明确设置#pragma rs_fp_full似乎永久解决了问题时,我得出了这个结论,因为它与native函数一起应该是硬件支持的计算(到目前为止,适用于在 Nexus 6 上导致问题的所有脚本)。

我在网上发现了一些人们通过刷新新驱动程序来解决 RS 问题的案例,但这对我来说是不可接受的。

回顾一下:我明确设置#pragma rs_fp_full.

于 2016-03-14T14:04:47.300 回答