我正在开发一个需要复杂的Photoshop类型混合效果的项目.我正在使用自定义RenderScript脚本来解决此问题.
我已经在运行Kitkat的Samsung galaxy S4设备上对其进行了测试,并且一切正常且非常快速.
然后,我尝试在运行Lollipop的Nexus 5上进行测试,发现性能突然下降.
我开始对代码中的各个部分进行计时,以查看哪些部分变慢,并提出了以下建议:
Allocation.createFromBitmap- Runtime on Kitkat - ~5-10 millisec- Runtime on Lollipop - ~100-150 millisecmRenderScript.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对象而不是每次都创建一个新对象似乎是一种公平的做法,但是我很高兴听到其他人对此事的经验提出意见.遗憾的是,在线上没有太多有关此主题的文档,但是到目前为止,一切似乎在多个设备/ *** 作系统上都运行良好.
总结以上是内存溢出为你收集整理的Java-Android-RenderScript-SDK 21中的性能下降全部内容,希望文章能够帮你解决Java-Android-RenderScript-SDK 21中的性能下降所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)