Android进阶:开启硬件加速

语言: CN / TW / HK

硬件加速指的是利用CPU和GPU各自的特性,将绘制工作一分为二,CPU负责复杂的逻辑运算,利用底层软件代码,将CPU不擅长的图形计算转换成GPU专用指令,由GPU完成,从而加快绘制速度。

开启硬件加速

在分析Android的绘制流程中,定位到ViewRootImpl类的draw函数,会发现在这里会有绘制的两个分支,一个走的是硬件绘制 mAttachInfo.mThreadedRenderer.draw函数,一个是软件绘制drawSoftware函数。而它们的判断走向条件是mAttachInfo.mThreadedRenderer != null && mAttachInfo.mThreadedRenderer.isEnabled()为true走硬件绘制,false软件绘制。定位到mThreadedRenderer初始化的地方enableHardwareAcceleration函数;

1、当application处于兼容模式,不允许硬件加速。什么是兼容模式?当AndroidMainfest.xml设置application节点的属性android:anyDensity=false,会导致mTranslator不为null,从而不支持硬件加速。该属性默认是true,表示适应任何屏幕密度。

2、请求开启硬件加速,即设置了FLAG_HARDWARE_ACCELERATED属性。请求了硬件加速,不保证一定开启了硬件加速,还需要根据后面的情况。

如何设置该属性,以请求硬件加速呢?

应用级别,在AndroidManifest.xml文件,application节点添加下面属性。

//开启
<application android:hardwareAccelerated="true" ...>
//关闭
<application android:hardwareAccelerated="false" ...>
复制代码

Activity 级别,在AndroidManifest.xml文件,activity节点添加下面属性。

//开启加速
<activity android:hardwareAccelerated="true" />
//关闭加速
<activity android:hardwareAccelerated="false" />
复制代码

窗口级别,在Activity或Dialog的onCreate方法中,setContentView函数之前,调用下面代码开启硬件加速。

window.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, 
	WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
复制代码

通过代码开启的窗口级别硬件加速是没办法停止的。而View级别可以停用硬件加速,但无法开启加速。

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
复制代码

3、在请求了硬件加速之后,需要判断当前设备是否支持硬件加速。

设备是真机,则支持是硬件加速;SurfaceFlinger服务开启失败,不支持硬件加速;若是虚拟机,其是OpenGL ES 2.0则支持硬件加速。

局限

并不是所有的View或者图形能通过GPU来绘制完成,具体约束可以参考Android官方文档,硬件加速。同时硬件加速也会带来一些坑,例如,在硬件加速情况下,WebView可能会导致整个界面花屏(文字,按钮,图形有大有小,不是自己设置的大小)。

更多硬件加速推荐文章

理解Android硬件加速原理的小白文

Android硬件加速原理与实现简介