硬件加速指的是利用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可能会导致整个界面花屏(文字,按钮,图形有大有小,不是自己设置的大小)。
更多硬件加速推荐文章