API 23 中遇到 RenderScript 不稳定

RenderScript instability encountered in API 23

我的应用程序使用基于 RenderScript 的 Canny 边缘检测的专有实现。我在具有各种 API 的众多设备上测试了它并且它工作非常可靠。现在我得到了运行 API23 的新三星 S7。在这里(而且只有在这里)我遇到了一个相当丑陋的问题。一些边缘图片布满了数以千计的伪影,这些伪影源自幅度梯度计算内核,并非基于实际图像信息。在尝试了所有类型的 TargetAPIs,打开和关闭 renderscript.support.mode 等之后,我终于发现问题只会出现,当 RenderScript(和脚本)实例用于第二个或更多时次。第一次使用时不会出现。

出于效率原因,我在 MainActivity 的 onCreate 方法中只创建了一次 RenderScript 和 Script 实例,然后重复使用它。我当然不想改变它。

有人能解决这个问题吗?谢谢

更新:这里发生了疯狂的事情。似乎新创建的分配从一开始就不是空的!当运行:

    Type.Builder typeUCHAR1 = new Type.Builder(rs, Element.U8(rs));
    typeUCHAR1.setX(width).setY(height);
    Allocation alloc = Allocation.createTyped(rs, typeUCHAR1.create());

    byte se[] = new byte[width*height];
    alloc.copyTo(se);

    for (int i=0;i<width*height;i++){
        if (se[i]!=0){
            Log.e("content: ", String.valueOf(se[i]));
        }
    }

...字节数组 se 中充满了有趣的数字...帮助!知道这是怎么回事吗?

UPDATE2: 我在这里被自己的无知绊倒了——真的不值得为这部杰作加分....然而,为了我的辩护,我必须说问题比这里出现的问题稍微微妙一些。上下文是,我需要分配一个全局分配(Byte/U8),它最初应该是空的(即零),然后在内核中通过 [=30 部分设置为 1(仅在边缘所在的位置) =]()。由于这工作了好几个月,我不再意识到我没有在这个分配中明确分配零的事实......这只对 API 23 产生了影响,所以也许这可以帮助其他人不要落入这个陷阱.... 所以,请注意:除了用 0 填充的数值数组(默认为 Java),不能假定分配在启动时全为零。谢谢,Sakridge。

基本类型 (non-struct/object) 的分配数据在创建分配时默认不初始化,除非使用 createFromBitmap api 传递位图。如果您预料到这一点,那么您的应用程序中可能存在错误,当驱动程序初始化为 0 时,该错误不会暴露。如果您可以 post 重现问题的示例代码,将会有所帮助。

通过从位图或 Java 数组复制来初始化您的分配。