AndroidUI优化——过度绘制overdraw

开头简单介绍一下overdraw,过度绘制。
这是一个android ui性能优化一个老生常谈的问题。指的是一帧的时间之内,同一个像素频繁地绘制。他会造成:

  • 占用不必要的GPU和CPU资源
  • 界面掉帧

OK,现在手机的性能也比较好了,怎么准确知道哪儿overdraw了呢。

Where?

打开手机的开发者权限,同时在下方能找到调试GPU过度绘制的选项。

  • 蓝色: 意味着overdraw 1倍。像素绘制了两次。大片的蓝色还是可以接受的(若整个窗口是蓝色的,可以摆脱一层)。
  • 绿色: 意味着overdraw 2倍。像素绘制了三次。中等大小的绿色区域是可以接受的但你应该尝试优化、减少它们。
  • 浅红: 意味着overdraw 3倍。像素绘制了四次,小范围可以接受。
  • 暗红: 意味着overdraw 4倍。像素绘制了五次或者更多。这是错误的,要修复它们。
    顺带偷偷一提,打开wx你会发现一页红...打开QQ却只有下方tab是红色的.

如何避免?

说白了,overdraw就是同一个像素点绘制了太多次了,这种重复劳动是不必要的。

1. 减少Layout层级

最想到的肯定是减少UI控件的层级,提高RelativeLayout的使用优先度。毕竟RelativeLayout可以完成任意复杂度的布局,他的表达能力是AndroidLayout4大布局里表现能力最强的。但是也有需要注意的地方:

  • 相比LinearLayout,RelativeLayout的强表达能力是基于性能上的牺牲,LinearLayout的易用性以及高效的特点依旧无法被取代,我们需要去衡量这两者之间的使用场景。
2. 去除Windows的默认背景
  • Android自带的主题会有一个默认的背景,这个背景是由Decorview(根布局)来进行管理的,会产生一次overdraw,如果你使用了自定义背景,就可以在setContentView方法之后,将背景置空: getWindow().setbackgroundDrawable(null);

  • 在开发过程中,必要时才给控件添加背景,以免产生一层overdraw。甚至可以将背景置为透明色:@android:color/transparent

3. 自定义控件优化
  • Android在绘制布局的时候会避免绘制一些不必要不可见的控件以减少overdraw,这算是Android自带的一些优化机制。但是,我们在自定义控件以后,重写了onDraw方法,使得Android无法自动识别当前控件的优化逻辑。这时候就需要我们手动去赋予优化逻辑了。

  • 这就要提到裁剪画布的方法canvas.clipRect(),这个方法可以将我们界面不需要显示的控件裁掉以达到减少控件重叠,节约GPU资源的效果。

  • 除了clipRect方法之外,我们还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作

4. ViewStub 高效占位符
  • 在布局时需要一些控件在需要的时候再显示出来。这时候我们常规的做法就是new一个控件,或者,设置控件的visiblity属性为View.GONE或者View.INVISIBLE这个两个属性使得控件暂时不可见。这种做法虽然逻辑简单,但是在控件显示时会创建对象,需要实例化,加载资源,是比较损耗内存的。

  • 这时候常规的做法是使用Android.view.ViewStub.他是一个View的占位符。在界面初始化时,他已经将控件的对象实例化,只不过这个对象耗费的资源非常小,非常轻量。然后在控件显示时,会进行imflate操作,并不会重新创建对象,对于内存的损耗就降低了。

5. merge标签
  • 这个标签就比较常用了。和<include>配合使用以期得到布局复用的效果算是比较常见的用法。这个标签的作用就是干掉一个层级。
6. 减少使用Alpha
  • 如果一个view要进行Alpha化,首先他需要生成view,这是一个层级,之后再做Alpha,这就形成了二次加载overdraw,时间和内存损耗双倍增加了。所以这玩意儿慎用。

  • 一定做Alpha转化的话,可以采用缓存的方式。
    通过setLayerType方式可以将当前界面缓存在GPU中,这样不需要每次绘制原始界面,但是GPU内存是相当宝贵的,所以用完要马上释放掉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 一个丑帅的男子 《何以笙箫默》的第二男主 面对一个女子的尴尬 撕心裂肺的疼痛 除了体贴入微的安慰 和安静的陪伴外 ...
    及羽阅读 249评论 0 3
  • 肠绞痛的判断标准:每天哭闹至少3个小时,每周哭闹至少3天,发作超过3周。 肠绞痛的发作特点:1、阵发性;2、发作时...
    A努力花钱阅读 919评论 0 0
  • 看了几篇写中国近代史上的牛人,他们的晚景有些很凄凉,真替他们不值,如此才华横溢的人困于时势,悲哉痛哉
    胡少狼阅读 128评论 0 0
  • 前几天,接到一个电话。 “儿子,给你说件事,别伤心“ ”说吧“ ”邻居家小孩,童童(化名),自杀了“ 我能听见电话...
    讲一个好故事阅读 202评论 0 9