API 23中遇到的RenderScript不稳定

时间:2016-03-26 01:15:51

标签: android renderscript

我的应用程序使用基于RenderScript的Canny边缘检测的专有实现。我在使用各种AP​​I的众多设备上测试了它,并且它非常可靠地工作。现在我让新的三星S7在API23上工作了。在这里(仅此处)我遇到了一个相当丑陋的问题。一些边缘图片上镶嵌了数千个来自Magnitude梯度计算内核的工件,并且不是基于实际的图像信息。在尝试使用所有类型的TargetAPI之后,打开和关闭renderscript.support.mode等等。我终于发现,只有在第二次或更多次使用RenderScript(和Script)实例时才会出现问题。首次使用时不会出现这种情况。

出于效率原因,我在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:我在这里偶然发现了自己的无知 - 这个杰作真的不值得......但是,为了我的辩护,我必须说问题稍微有点微妙它出现在这里。上下文是,我需要分配一个全局分配(字节/ U8),该分配最初应为空(即零),然后在内核中通过rsSetElementAt_uchar()部分设置为1(仅限于边缘)。由于这个工作了好几个月,我不再知道这个事实,我没有明确地在这个分配中分配零....这只会在API 23中产生影响,所以也许这可以帮助其他人不要陷入这个陷阱....所以,请注意:除了填充0的数字数组(默认情况下为Java),分配不能假定在启动时充满零。谢谢,Sakridge。

1 个答案:

答案 0 :(得分:2)

创建分配时,默认情况下不会初始化基本类型(非结构/对象)的分配数据,除非使用createFromBitmap api传递位图。如果您期望这样,那么您的应用程序中可能存在一个错误,当驱动程序初始化为0时,该错误不会暴露。如果您可以发布再现问题的示例代码,将会有所帮助。

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