Android性能优化1

1.渲染------Reder Performance

Android系统每隔16ms会发出VSYNC(垂直同步)信号,该信号会触发UI的渲染,如果每次都渲染成功,那么就可以达到60fps,为了实现60fps的流畅画面,那程序的操作必须在16ms中完成。

2.过度绘制------Understanding Overdraw

指屏幕中的摸个像素在同一帧的时间内被绘制了对此,在多层次的ui结构中如果不可见的UI也在做绘制的操作,这样会导致像素区域被绘制多次,从而浪费了大量的cpu和gpu资源。在手机的开发者选项的Show GPU Overdraw选项可以产看UI的绘制情况。

3.不恰当的垂直同步------Understanding VSYNC

Refresh Rate---屏幕一秒内刷新屏幕的次数,取决于硬件的固定参数

Frame Rate---GPU在一秒内绘制操作的帧数

GPU会获取图形数据进行渲染,然后硬件负责吧渲染后的内容呈现到屏幕上。如果出现发生频率与刷新频率不一致,就会出现图片断裂等

4.Android中UI绘制与GPU

Resterization(栅格化)是绘制AndroidUI(button/shape/string/bitmap)的最基础的操作,它把这些组件拆分到不同像素上进行显示,而GPU的引入就是为了加快栅格化的操作。

CPU负责吧UI组件计算成Polygons、Texture纹理,然后交给GPU进行栅格化渲染,每次从CPU转移到GPU是一件麻烦的事情,但是可以通过OpenGL ES可以把那些需要渲染的纹理Hold在GPU Memory中,在下次需要渲染的时候直接进行操作。

Android中诸如Bitmaps、Drawables都是一起打包到同一的Texture纹理中,然后再传递到GPU中,所有每次需要这些资源时,都是直接从纹理中进行渲染的。显示图片时需要先经过CPU的计算加载到内存中,然后传递到GPU进行渲染;文字显示更加复杂,需要先使用CPU换算成纹理,然后交给GPU进行渲染,回到CPU绘制单个字符时,再重新引用经过CPU渲染的内容。

为了使APP流畅,需要在每一帧16ms内处理完所有的CPU与GPU的计算、绘制和渲染等。

5.Invalidations(失效),Layouts,Performance

Android中把XML布局文件转化为GPU可以识别并绘制的对象是通过DisplayList实现,DisplayList持有所有将要交给GPU绘制到屏幕上的数据信息。当某个View第一次需要被渲染时,DisplayList会第一次被创建,当这个view需要显示在屏幕上时,会执行GPU绘制来进行渲染,如果后续有执行类似移动这个view位置等的操作而需要再次渲染这个view时,就只需要额外执行一次渲染就可以,但是如果修改了view中某些可见组件,那么之前的DisplayList酒不能继续使用。

任何时候view中绘制内容发生变化时都会重新执行创建DisplayList,渲染DisplayList,更新到屏幕上等一系列操作。这里的快慢等性能取决于该view的复杂程度,view的状态变化以及渲染管道的执行性能。

6.内存抖动----Memory Churn

Android有自动管理内存的机制,但是对内存的不恰当使用仍然会引起严重的性能问题,在同一帧里面创建过多的对象也会回引起某些问题。

Android系统中有一个Generational Heap Memory模型,该模型会根据内存中不同的内存数据类型分别执行不同的GC操作,例如,最近刚分配的对象会放在Young Gengeration区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收,同时这个区域的GC操作也比Old Generation区域的GC操作速度更快。除了速度差异外,执行GC操作的时候,任何线程的任何操作都会被暂停,等待GC操作完成后,其他操作才会继续执行,一般来说,单个GC并不会占用太多时间,但是大量不停的GC操作则会显著占用帧间隔时间,如果在帧间隔时间中做了过多的GC操作,那么在这16ms内中其他类似计算、渲染等操作的可用时间就变得更少。

引起GC频繁执行的两个原因:

Memory Churn 内存抖动,内存抖动是因为大量的对象被创建后又在短时间内马上被释放

瞬间产生大量的对象会严重占用Young Generation中的内存区域,当达到阀值,剩余空间不够时也会触发GC,即使每次分配的对象占用了很多的内存,但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。

 关于常见的问题:避免在for循环里面分配对象占用内存,将对象的创建移到循环体之外;自定义view中的ondraw方法也需要引起注意,每次屏幕方法绘制以及订花执行过程中,ondraw方法都会被调用,避免在onDraw方法中执行复杂的操作,避免创建对象,对于无法避免需要创建对象的情况,需要考虑对象池模型,通过对象池来解决频繁创建与销毁的问题,但是需要注意结束使用后需要手动释放对象池中的对象。

7.垃圾回收机制--------Garbage Collection in Android

原始的jvm的GC机制在Android中得到了很大程度的优化。Android中是一个三级Generation的内存模型,最近分配的对象会存放在Young Generation区域,当这个对象在这个区域停留的时间达到一定程度,它会被移动到Old Generation,最后到Permanent Generation区域;每一个级别的内存区域都有固定的大小,此后不断有新的对象分配到此区域,当这些对象总的大小快达到这一级别内存区域的阀值时,会触发GC机制,以便腾出空间来存放其他新的对象。每次GC发生时,所有的线程都是暂停状态,GC所占用的时间和它是哪一个Generation也有关系,Young Generation的每次GC操作时间是最短的,Old Generation其次,Permanent Generation最长,执行时间的长短也和当前Generation中对象的数量有关。

8.内存泄漏

 内存泄漏是指程序不再使用的对象无法被GC识别,导致这个对象一直留在内存中,这样会使得每级Generation的内存区域可用空间变小,GC就会更容易被触发,从而引起性能问题。

9.电池处理

尽量减少唤醒屏幕的次数和持续时间,使用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定即使关闭操作进入休眠状态。

某些非必须马上执行的操作,可以等设备处于充电状态荷藕这点亮充足时进行操作

触发网络请求的操作,每次斗湖保持无线信号持续一段时间,可以把零散的网络请求打包进行一次操作,避免过多的无线信号引起的电量消耗。

Android会不断关闭各种硬件来延长手机的待机时间,首先屏幕会逐渐变暗知道关闭,然后CPU进入休眠。但是即使在休眠状态下,大多数应用还是会继续尝试进行工作,他们会不断的唤醒手机。一个简单的唤醒手机的方法是使用PoweManager.WakeLock的API来保持CPU工作并防止屏幕变暗关闭,这使得手机可以被唤醒,执行工作,然后回到睡眠状态。使用JobScheduler所做的事情就是根据当前的情况和任务,结合出理想的唤醒事件,例如手机正在充电或者链接到WiFi时指向该操作。

从Android5.0开始,使用Battery History Tool可以查看系统被唤醒的频率,被谁唤醒,持续多久等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值