编程语言
首页 > 编程语言> > Java-Android-RenderScript-SDK 21中的性能下降

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

作者:互联网

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

我已经在运行Kitkat的Samsung Galaxy S4设备上对其进行了测试,并且一切正常且非常快速.

然后,我尝试在运行Lollipop的Nexus 5上进行测试,发现性能突然下降.

我开始对代码中的各个部分进行计时,以查看哪些部分变慢,并提出了以下建议:

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对象时性能突然下降.

我有什么可以针对API 21 OS进行操作的,这些方法可以使这些方法运行得更快?

有人遇到过这个问题或可以重现吗?

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

任何输入将不胜感激.

编辑:

我在这里复制了Github中的Android的Lollipop发行版源代码中的相关行Allocation.java

static public Allocation createFromBitmap(RenderScript rs, Bitmap b) {
        if (rs.getApplicationContext().getApplicationInfo().targetSdkVersion >= 18) {
            return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
                                    USAGE_SHARED | USAGE_SCRIPT | USAGE_GRAPHICS_TEXTURE);
        }
        return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
                                USAGE_GRAPHICS_TEXTURE);
    }

请注意,当目标SDK高于17时,默认情况下会使用USAGE_SHARED标志创建分配.可能是这些额外的标志导致了问题吗?我应该改为使用USAGE_GRAPHICS_TEXTURE标志吗?

编辑2

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

adb shell setprop debug.rs.default-CPU-driver 1

此后,所述功能的运行时间明显更快(分别为〜30-40毫微秒和20-50毫微秒).仍然没有棒棒糖之前的设备快,但在可接受的性能范围内.

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

我可以在代码中做些什么来模拟这个adb调用吗?

最终编辑

好的,看来问题出在我每次调用使用RenderScript执行混合效果的函数时都在创建一个新的RenderScript对象.

我做了一些代码重构,现在,我没有在每次对effect方法的调用上创建一个新的RenderScript对象,而是每次都重复使用同一对象.在Lollipop设备上创建RenderScript对象的第一次创建仍然需要更长的时间,但是由于我继续在多个方法调用中重复使用同一对象,因此该问题得以缓解.

我将其添加为答案.

解决方法:

看来问题出在我每次调用使用RenderScript执行混合效果的函数时都在创建一个新的RenderScript对象.

我做了一些代码重构,现在,我没有在每次对effect方法的调用上创建一个新的RenderScript对象,而是每次都重复使用同一对象.在Lollipop设备上创建RenderScript对象的第一次创建仍然需要更长的时间,但是由于我继续在多个方法调用中重复使用同一对象,因此该问题得以缓解.

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

根据this的帖子,重用RenderScript对象而不是每次都创建一个新对象似乎是一种公平的做法,但是我很高兴听到其他人对此事的经验提出意见.遗憾的是,在线上没有太多有关此主题的文档,但是到目前为止,一切似乎在多个设备/操作系统上都运行良好.

标签:renderscript,java,android
来源: https://codeday.me/bug/20191028/1953805.html