Android进阶:开启硬件加速

Android进阶:开启硬件加速

Android小彩虹2021-08-26 1:28:02190A+A-

硬件加速指的是利用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硬件加速原理与实现简介

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1
本网站由 提供CDN/云存储服务

联系我们