Java Android-RenderScript-SDK 21中的性能下降

Java Android-RenderScript-SDK 21中的性能下降,java,android,renderscript,Java,Android,Renderscript,我正在开发一个需要复杂Photoshop类型混合效果的项目。我正在使用自定义RenderScript脚本来解决这个问题 我已经在运行Kitkat的三星Galaxy S4设备上进行了测试,一切都很好,速度也很快 然后我试着在Nexus5上运行棒棒糖,我发现性能突然下降 我开始对代码中的各个部分进行计时,以查看哪些部分的速度减慢,并得出以下结论: Allocation.createFromBitmap - Runtime on Kitkat - ~5-10 millisec - Runtime on

我正在开发一个需要复杂Photoshop类型混合效果的项目。我正在使用自定义
RenderScript
脚本来解决这个问题

我已经在运行Kitkat的三星Galaxy S4设备上进行了测试,一切都很好,速度也很快

然后我试着在Nexus5上运行棒棒糖,我发现性能突然下降

我开始对代码中的各个部分进行计时,以查看哪些部分的速度减慢,并得出以下结论:

Allocation.createFromBitmap
- Runtime on Kitkat - ~5-10 millisec
- Runtime on Lollipop - ~100-150 millisec

mRenderScript.destory()
- Runtime on Kitkat - ~1-3 millisec
- Runtime on Lollipop - ~60-100 millisec
我很好奇为什么在一个应该更强大的设备和一个应该更高级的操作系统上创建
分配
对象和销毁
RenderScript
对象时性能会突然下降

对于API21操作系统,我能做些什么来提高这些方法的运行速度吗

有没有人遇到过这个问题,或者可以重现这个问题

我应该注意,脚本的实际运行(即
ScriptC.forEach
方法)在两个设备/操作系统上都运行得非常快。此外,我使用的是本机
RenderScript
api,而不是任何支持库

如有任何意见,将不胜感激

编辑:

我在这里复制了Github中Androids棒棒糖发布源代码的相关行

请注意,当目标SDK高于17时,默认情况下使用
USAGE\u SHARED
标志创建分配。可能是这些额外的标志导致了问题吗?我应该使用
用法\u图形\u纹理
标志吗

编辑2

按照的建议,当Nexus 5连接到我的计算机时,我运行了以下脚本:

adb shell setprop debug.rs.default-CPU-driver 1
在此之后,上述函数的运行时间显著加快(分别约为30-40毫秒和20-50毫秒)。仍然没有棒棒糖前的设备快,但在可接受的性能范围内

这个解决方案的唯一问题是,除非我不了解某些东西,否则不能将其视为解决方案,因为它需要我在每个有问题的设备上调用此脚本,然后再在其上运行应用程序

在我的代码中有什么可以模拟这个adb调用的吗

最终编辑

好的,问题似乎源于这样一个事实:每次调用使用RenderScript执行混合效果的函数时,我都在创建一个新的RenderScript对象

我做了一些代码重构,现在,不是每次调用effect方法时都创建一个新的RenderScript对象,而是每次都重复使用相同的对象。第一次在棒棒糖设备上创建RenderScript对象仍然需要更长的时间,但是现在这个问题得到了缓解,因为我继续在多个方法调用中重用同一对象


我将补充这一点作为答案

Api 18中添加了一种分配类型(使用共享)。如果强制Renderscript复制位图备份内存(而不是就地使用),则可能会导致差异

 Allocation tmpOut = Allocation.createFromBitmap(mRenderContext, result, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SHARED);

问题似乎源于这样一个事实:每次调用使用
RenderScript
执行混合效果的函数时,我都在创建一个新的
RenderScript
对象

我做了一些代码重构,现在,不是每次调用effect方法时都创建一个新的
RenderScript
对象,而是每次都重复使用相同的对象。第一次在棒棒糖设备上创建
RenderScript
对象仍然需要更长的时间,但问题现在得到了缓解,因为我在多次方法调用中继续重用同一对象

一旦我确定不再需要它以确保没有内存泄漏,我就确保对共享的
RenderScript
对象调用
destory()


据《华盛顿邮报》报道,重用
RenderScript
对象似乎是一种公平的做法,而不是每次都创建一个新的对象,但我很高兴听到其他人就他们在这方面的经验提出意见。遗憾的是,在线上没有太多关于这个主题的文档,但到目前为止,在多个设备/操作系统上,一切似乎都运行良好

谢谢你,我只能在星期天检查,所以我会在那跟你联系。内核启动的时间也改变了吗?你是说实际渲染的时间?不需要。只有在创建分配对象和调用RenderScript对象上的destroy()时才需要。谢谢,还有一件事需要尝试。“adb shell setprop debug.rs.default-CPU-driver 1”,它将在SOC驱动程序发生变化时禁用硬件驱动程序。这大大提高了运行棒棒糖的Nexus 5设备的性能,但我不确定这是否符合解决方案的要求,因为在运行我的应用程序之前,我似乎需要在每个设备上都这样做。。。这个adb调用的意义是什么?最好重新使用RS对象。通过跳过GPU加速驱动程序的加载,将setprop设置为强制CPU执行可加快上下文创建。出于同样的原因,它会降低性能。加载驱动程序的成本很高,因此应该重新使用上下文,理想情况下每个进程只加载一个驱动程序。在创建和销毁它们时,要像在OpenGL上下文中一样小心。
 Allocation tmpOut = Allocation.createFromBitmap(mRenderContext, result, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SHARED);