关于开发 Android 应用时 Application 或者 Activity 的 android:hardwareAccelerated="true" 的问题

2015-09-11 15:34:36 +08:00
 greenskinmonster
你们的应用是怎么设置的?
我自己试了下,貌似设不设差别不是太大。

所以来看看有没有先行者分享下经验。
9195 次点击
所在节点    Android
23 条回复
wy315700
2015-09-11 15:42:37 +08:00
遇到刷新快一点的页面,不开硬件加速会出闪

遇到大的图片,开了硬件加速会有问题

当然,如果手机开了强制 GPU 渲染,这个选项是无效的
greenskinmonster
2015-09-11 15:54:46 +08:00
@wy315700 多谢~莫非还是要保留个开关?
wy315700
2015-09-11 15:58:34 +08:00
@greenskinmonster 看你使用场景了。。
greenskinmonster
2015-09-11 16:02:04 +08:00
@wy315700 论坛客户端,文字图片都有,大段文字时有点卡。现在想看看有什么办法改进下流畅性。
wy315700
2015-09-11 16:04:04 +08:00
@greenskinmonster 卡的话开了硬件加速会比较好,但是大图片(4096 以上分辨率)的处理就要小心了
kifile
2015-09-11 16:08:14 +08:00
硬件加速是属于在内存里始终保持了一块区域装载上一次的绘制图像,因此他其实是用内存空间换速度。
greenskinmonster
2015-09-11 16:08:53 +08:00
@wy315700 这么大的图都是缩放了才显示的。不过有时候会有一页会有上百张图,不知道硬件加速会不会导致更容易 OOM 。看来需要去实际测试下看看了。
kyze8439690
2015-09-11 16:10:16 +08:00
拿空间换速度
wy315700
2015-09-11 16:14:52 +08:00
@greenskinmonster 主要是长图,,,见过 300*30000 的图,,,
greenskinmonster
2015-09-11 16:20:42 +08:00
@wy315700 长图不截短的话,我这估计超过 4K 的高度就显示不出来了。

内存方面刚刚测试了一下,似乎还好,先后打开了几个上百张图的帖子,还没翘掉。
greenskinmonster
2015-09-11 16:27:34 +08:00
@kifile @kyze8439690 这个内存应该还是算在 App 的占用里面,而不是系统级的吧?意思是理论上会导致 App 更容易 OOM 吧?
liangzhitao
2015-09-11 16:44:06 +08:00
greenskinmonster
2015-09-11 16:48:56 +08:00
@liangzhitao 已经在用这个了,个别图片显示的有点问题,但是总体还是很棒的。不过我想试下硬件加速主要还是解决 TextView 含有大量文字时,以及 Fragment 切换时的性能问题。
allan1st
2015-09-11 17:26:57 +08:00
@greenskinmonster 大段文字卡可能是 TextView 的问题,看看 Instagram 怎么解决的: http://instagram-engineering.tumblr.com/post/114508858967/improving-comment-rendering-on-android
kifile
2015-09-11 17:56:29 +08:00
@greenskinmonster 首先他保存的图像内存并不是保存的所有图片,而是当前 View 的绘制界面,也就是说那些使用 ListView 但是没有加载出的图片其实并没有放到内存里,所以虽然你总的图片很多,但是很多图片其实是没有占用额外内存的。
kyze8439690
2015-09-11 18:50:17 +08:00
通用的思想而已,硬件加速本身会占用内存。
然后你所说的列表滚动卡的问题,也可以用空间换速度。
首先列表为什么会卡?这就涉及列表滚动的时候做了什么事。
主要看 getView 函数,
可能的 inflate ,以及数据绑定。然后 listview 去 measure , layout ,最后 draw 。
inflate 方面,可能因为 xml 的层次过多导致 inflate 耗时过多,这时候就要简化 xml 结构,整个也会影响 listview 的 measure 和 layout 的耗时。还有一个可能就是一个 listview 采用了多种 type ,导致滚动时新的 type 没有缓存,导致 inflate 耗时,这时候可以事先新建好 view 来复用。
inflate 之后,就是数据绑定的事情了,这里可能会对数据做一些处理,比如格式化,等等。这里就是我建议的空间换速度,把数据事先格式化好,尽量减少 getView 的耗时。
measure 和 layout 就靠简化 xml 层次,前面已经说了。 draw 的话就尽量减少 overdraw 。

关于硬件加速的问题,一般不会去开启它,因为他是全局性的( application )。可以尝试在 View 的层次去局部开启硬件加速,比如对一个 View 做 animation 的时候,先开启硬件加速, animation 结束后关闭硬件加速。

可能有点乱,讲究着看。
greenskinmonster
2015-09-11 19:28:01 +08:00
@kyze8439690 多谢,说的都对啊,特别是 inflate - measure 这段。
但是现在限于水平问题,比较难准确的分析出来,到底哪里还有改进的空间,具体怎么改进。
所以先想走个捷径,看看硬件加速有没有用。
greenskinmonster
2015-09-11 19:28:28 +08:00
@allan1st 多谢,我收藏下看看。
kyze8439690
2015-09-11 19:44:05 +08:00
method tracing
还是针对性优化比较好,你这个改动太大。
greenskinmonster
2015-09-12 06:49:01 +08:00
@kyze8439690 多谢,暂时采用了 animation 时临时开启硬件加速的办法

有兴趣的看这篇文章吧
http://daniel-codes.blogspot.sg/2013/09/smoothing-performance-on-fragment.html

不过主观上还没法评价改进幅度,模拟器上开不开都傻快傻快的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/219958

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX