渲染优化

众所周知Android系统每隔16ms重新绘制一次activity,也就是说你的app必须在16ms内完成屏幕刷新的所有逻辑操作,这样才能达到60帧/s  (16.66=1000/60). 而用户一般所看到的卡顿是由于Android 的渲染性能造成的。

如图:

然而有的时候你的程序会出现这样的情况,如果某个绘制操作超过16ms用了24ms,这时候用户看同一张图片花了32秒,用户就会感到卡顿,这种现象我们叫-丢帧



那么我们如何了解是如何出现这种情况并如何去解决,
首先我们要了解android 的渲染机制

android 的渲染主要分为两个组件:
1.CPU  2.GPU 屏幕上的绘制就是由他们两共同完成的。

在屏幕上绘制UI无论是按钮还是复选框文本首先都需要CPU去将这些对象转换为多边形和纹理,然后再交给GPU去栅格化操作。
问题来了:

1.CPU将对象转换位多变形和纹理耗时,同样上传到GPU也耗时。
幸运的是OpenGL-ES API允许数据上传到GPU进行数据保存,当下一次绘制的时候只需要在cpu的存储器里引用它
所以渲染性能的优化就是尽快的上传数据到GPU,尽可能长的在不修改数据的条件下保存数据
虽然安卓系统已经完成了大部分优化,但还有一个问题造成性能的影响--过度绘制

那么什么是过度绘制呢

屏幕上的某个像素点在同一帧的时间内绘制了多次

如何清除过度绘制呢。

蓝色--代表正常,淡绿--绘制了两次,淡红--绘制了3次 深红--绘制4次或更多。


我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。


我们可以通过手机设置里面的开发者选项,打开Show GPU overdraw选项,可以观察UI上的Overdraw的情况

1.将Activity中的主题背景置为空,如下getWindow().setBackGroundDrawable(null)
2.去掉不必要的布局背景图片
3.我自定义控件时,可以使用canvas.clipRect()方法( 对画布进行裁剪)避免出现重叠的区域

上面是对GPU的优化,接下来我们对CPU的优化

layout刷新避免复杂的层级结构嵌套

这里我们可以通过HierarchyViewer工具来分析我们打开之后会看到下面的层级结构如图:


绿色快于一般的50% 黄色慢于一般的50%  红色表示视图管道中最慢 
比如
linearLayout 中包裹RelativeLayout,能用一个RelativeLayout尽量用一个搞定

megar替换不需要的t布局  ViewStub标签替换需要显示隐藏的布局





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值