Android系统与IOS系统相比一个重要的缺点就是,IOS系统运行起来会更加流畅,这是Android系统用户体验不如IOS的原因之一。当然,Android系统也可以通过一系列的优化,来确保运行的流畅。
为了避免迟缓的UI效果或者运行的停顿,必须确保动画一直运行在每秒60帧。我们可以从硬件和软件两个方面来进行优化。
一、硬件加速
Android通过GPU来进行硬件加速。GPU,全称 Graphic Processing Unit,即“图形处理器”。它是相对于CPU的一个概念,是专门进行图像处理的核心处理器。绝大部分Android设备都有GPU。
因为启用硬件加速会消耗更多的资源和内存,而且硬件加速并不支持所有的2D动画效果,所以应该仅在需要的时候才使用硬件加速。
注意:在Android 4.0(API 级别 14)以上版本中,默认对所有应用程序都开启了硬件加速。
1、硬件加速级别
有四种级别:Application、Activity、Window、View
Application 层
<uses-sdk android:targetSdkVersion="11" />
<application android:hardwareAccelerated="true" ...>
Activity 层
如果整个应用开启硬件加速表现的不稳定,也可以针对单个Activity进行控制。在Activity层开启或者关闭硬件加速,可以使用android:hardwareAccelerated属性在<activity>标签内。下面是单个Activity中关闭硬件加速的例子:
<application android:hardwareAccelerated="true">
<activity ... />
<activity android:hardwareAccelerated="false" />
</application>
可以在全局设置硬件加速,然后再针对单个Activity关闭硬件加速。
Window 层
如果你需要更细致的控制,可以在获得的Window里开启硬件加速:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
注意:在window层不能取消硬件加速。
View 层
通过下面代码,你可以在运行时关闭硬件加速:
myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
或者在view中加入属性:
android:layerType="software"
二、软件加速
在Android应用程序中,GUI线程不仅承担了绘制所有View的任务,还负责处理与用户的交互。所以,如何GUI线程忙于刷新View的话,它响应用户操作就会变慢,我们都知道,如果响应用户时间超过5s,程序就会报ANR错误,这是一种非常不好的用户体验。
为了解决这一类问题,可以使用以下几种方法:
1、软件加速。如上,在view中加入属性:
android:layerType="software"
则会使用一种软件的方式加速,我们知道,硬件加速有可能导致渲染错误,所以可以选用这种方式来进行加速。
2、使用SurfaceView,它使用后台线程控制并刷新View,使GUI线程能去执行其他计算任务。
3、使用TextureView,SurfaceView虽然改善了应用程序的性能,但它无法实现图像变换,换句话说,SurfaceView无法实现移动、缩放或旋转。但是TextureView可以支持普通的View操作。但是,值得注意的是:TextureView仅能用于启用了硬件加速的窗口,否则就绘制不出任何东西。
三、资料
Hardware Acceleration(android English API ) http://developer.android.com/guide/topics/graphics/hardware-accel.html
Android 4.0的图形硬件加速及绘制技巧(2) http://mobile.51cto.com/hot-302203_1.htm
android图形系统详解六:View layer http://www.2cto.com/kf/201204/127664.html
控制硬件加速:http://blog.youkuaiyun.com/niu_gao/article/details/7443574