硬件加速:硬件加速执行的所有的绘图操作,都是使用GPU在 View 对象的画布上来进行的。如果盒子有GPU,设置这个会有更好的表现,同时分担CPU的压力(现在的盒子应该都有GPU)。下面是官方解释:
从Android3.0 (API level11)开始,Android的2D显示管道被被设计得更加支持硬加速了.硬加速使用GPU承担了所有在View的canvas上执行的绘制操作。硬件加速:硬件加速(Hardware acceleration)就是利用硬件模块来替代软件算法以充分利用硬件所固有的
快速
特性。anroid 4.0之后的版本是默认开启硬件加速的,附上官方说明:Beginning with Android 4.0, hardware acceleration for all windows is enabled by default if your application has set either targetSdkVersion or minSdkVersion to “14" or higher.
- 硬件加速通常比软件算法的
效率
要高
。 因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存。- 计算机
显示
使用硬件加速会快
些,但有时会带来负面效果,如会在投影仪或截图时发现显示区是黑的,这时就要关闭硬件加速(硬件加速反方向操作)
1. 是否应该开启WebView硬件加速
(1) 是否应该开启WebView硬件加速
- 硬件加速执行的所有的绘图操作,都是使用GPU在 View 对象的画布上来进行的。因为启用硬件加速会增加资源的需求,因此这样的应用会占用更多的内存。
- 由于Android的2D渲染现在可以比较好的支持硬件加速了,但是在自定义控件进行绘制是还是有很多api不兼容的,所以在自定义控件的时候,在你不能100%确认你使用的api支持硬件加速的话,最好把硬件加速关闭了,否则有可能出现一些莫名其妙的问题。
(2) 开启硬件加速后会遇到的问题:页面渲染问题(页面白屏或闪烁)
- 在某些手机上可能会出现分块渲染,刷新不及时的问题(尤其是快速滑动网页的时候)
- 花屏问题:View 刷新时会出现花屏;手机阅读翻页UI花屏异常
- webview开启了硬件加速后会出现闪烁问题、Android 使用WebView加载含有echarts的页面,截图不显示、Android layer type与WebView白屏以及WebView不随动画而动的问题::为了应用的整体速度,可单独对WebView关闭硬件加速,即webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)。
(3) 关闭硬件加速可能会遇到的问题:页面滑动卡顿
- 在部分手机上使用video标签无法正常播放视频,如果遇到视频只有声音没有图像,是因为系统关闭了硬件加速。
关于视频的解决方法:一个是对于播放视频的webView单独开硬件加速,或者调用外部原生播放器单独播放视频。
- 无法使用WebGL功能(Android5以上系统支持);全景图某些实现方式加载不全
- 在某些手机上界面渲染效率低,滚动不流畅,影响用户使用体验。
(4) 需开启硬件加速的情形示例
- WebView内嵌h5网页播放视频:HTML5 Video support(In order to support inline HTML5 video in your application you need to have hardware acceleration turned on.)
- WebView 在3.0+后显示flash要启用硬件加速:开启硬件加速也能够使绘制更加平滑
2. 开启硬件加速的方法
启用硬加速最简单的的方法是对整个应用启用硬件速.如果你的应用只使用标准的view和Drawable,全局启用硬加速将不会带来任何负面影响.然而,因为硬加速不是被所有的2D绘制所支持,所以启用它时可能对你的自定义绘制产生影响.出现的问题经常是不可见的,也可能是异常,或错误地显示了像素.为了避免这些问题,Android提供了在以下各级别上启用或禁止硬加速的能力。
四种级别对应的开启方式:开启硬件加速只需要在清单文件或者WebViewActivity中配置即可
- Application级别:<applicationandroid:hardwareAccelerated="true" ...>
- Activity级别:<activity android:hardwareAccelerated="false" ...>
- Window级别:getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
- View级别:mView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
3. 硬件加速关闭的方法
- 在清单文件的application节点下进行关闭或者打开,这种方式是作用于整个应用的:
<!--false表示关闭,true表示打开-->
android:hardwareAccelerated="false"
- 在activity注册时进行关闭或者打开,这种方式只作用于该activity:
<activity
android:name=".WebViewTest"
android:hardwareAccelerated="false"/>
- 在指定View初始化时关闭或者打开,这种方式只作用于该View控件:
//如果是自定义的view,可在构造方法中调用该方法,即可开启或者关闭硬件加速
setLayerType(View.LAYER_TYPE_SOFTWARE, null)
注:现在还不能在window级别禁止硬加速.
4. 总结
- anroid 4.0之后的版本默认开启硬件加速,可根据实际场景对四种级别选择性地设置开启或关闭硬件加速。
- 硬件加速使得view绘制更加
平滑
,但是需消耗更多内存
。 - 使用webview时,开启硬件加速可能会造成页面
白屏或闪烁
;但是关闭硬件加速又可能会造成网页滑动卡顿不流畅
。所以开启硬件加速之前,最好能够和产品沟通该webview可能会加载哪些类型的页面。如果多类型,尝试分类型设置。
5. 判定一个View是否能被硬加速
有时一个应用了解是否启用了硬件速是很有用的,对那些自定义View之类的东西尤其重要.在你的应用做了一些不被最新的管线所支持的自定义绘制时这更加重要.有两种方法可以检查应用是否被硬加速:
- View.isHardwareAccelerated():如果View附加到一个硬加速的window上就返回true.
- Canvas.isHardwareAccelerated():如果Canvas被硬加速了就返回true.
如果你必须在你的绘制代码中做这个,应使用Canvas.isHardwareAccelerated()而不是View.isHardwareAccelerated().当一个view附加到一个硬加速的window上,它仍可以使用非硬件速的Canvas进行绘制操作.比如当为了高速缓存而把一个view画到一个bitmap中.