Android性能优化之渲染优化

来源:互联网 发布:暖气管道钥匙 淘宝 编辑:程序博客网 时间:2024/05/01 22:05
Android性能优化之渲染优化:
Android系统每隔16ms就会重新绘制一次Activity。也就是说你的app必须在16ms内完成屏幕刷新的所有逻辑操作。
如果某个绘制操作超过16ms而用了24ms,这时候用户看到同一张图片就用了32ms而不是16ms,用户就会感到卡顿,这种现象我们叫--丢帧。

Android的渲染机制:
Android渲染主要分为两个组件:
1、CPU
2、GPU
由这两者共同完成在屏幕上的绘制:
Activity如何将复杂的UI转换成用户看得懂的图像并绘制到屏幕上?
这是由栅格化(栅格其实就是像素,PS中的术语)操作完成的,所谓的栅格化就是绘制那些Button,Shape,Path,String,Bitmap等组件最基础的操作。
它把组件拆分到不同的像素上进行显示,说得俗气一点,就是解决那些复杂的xml布局文件和标记语言,使之能转换成用户看得懂的图像,但是这不是直接转换的,xml布局文件需要在CPU中首先转换为多边形或纹理,然后传递给GPU进行格栅化,对于格栅化,跟OpenGL有关。
简而言之,CPU将xml布局转换为多边形或者纹理(也可能是矩形,圆形等,具体看图像的外边框形状),然后OpenGL(GPU)再进行栅格化。

简单理解android的渲染过程:
在屏幕绘制UI对象的时候,先是通过CPU将xml布局转换成对应的多边形,然后GPU再进行栅格化操作

cpu将对象转换为多边形耗时 同样上传到GPU也耗时,所以我们要减少对象转换次数以及上传数据的次数。还好,OpenGL-ES API允许数据上传到GPU进行数据保存,当下一次绘制按钮的时候只要在CPU存储器里引用它。
所以渲染性能的优化,就是尽快的上传数据到GPU尽可能长的不修改数据的条件下保存数据。

过度重绘的可能原因之一,window自带了背景颜色,你所有的控件都是在这层背景之上进行绘制的:
解决方式: 去掉默认背景.
如果整个window存在一个背景,所以进行了一次重绘,这个背景的重绘是系统级别的.和主题有关.所以我们只需在文件管理器的主Activity的onCreate()方法中,加入:
this.getWindow().setBackgroundDrawableResource(android.R.color.transparent);//transparent是透明的,颜色代码是#00000000
优化之后,背景被去掉之后就少了一层过度绘制了.


绘制优化:
绘制优化是指View的onDraw()方法要避免产生大量的操作,主要有两点:
1)尽量不要在onDraw()方法中创建临时对象,就是尽量不要在onDraw()里面new东西,不仅占用了过多的内存,还会频繁的调用gc,降低了程序的执行效率.
2)尽量不要在onDraw()方法中做耗时任务,也不要执行成千上次的循环操作,尽管每次循环都很轻量级,但是大量的循环仍十分强占CPU的时间,会造成View的绘制过程不流畅.