关于安卓手机的硬件加速问题

分类: Android基础  2012-04-12 14:44  740人阅读  评论(0)  收藏  举报

最近听同事讨论硬件加速问题,完全不懂。于是乎,百度了下,原来从3.0开始,安卓开始支持硬件加速,手机自然是从4.0开始支持的了。而且配置方法一种是在代码中配置硬件加速,这个也分很多个级别,在minifest中;一种方式是在手机的开发人员选项中启用硬件加速,不过似乎只有google的nexus有这个选项,其它的手机都别屏蔽了。

硬件加速的官方文档:http://developer.android.com/guide/topics/graphics/hardware-accel.html

开启硬件加速有两种大的途径

1.在系统设置“开发人员……”中勾选启用GPU加速

2.在应用程序中启用硬件加速

目前遇到的问题有,启用硬件加速后,WebView的性能受到一定影响,设置背景透明无效。

目前4.0的系统有硬件加速,之前的版本不太清楚。

我们来看怎样在程序中启用硬件加速

      
  1. if (VERSION.SDK_INT > VERSION_SDK_ELEVEN)
  2. {
  3. getWindow().setFlags(
  4. WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
  5. WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
  6. }

这是,Window级别的硬件加速就启动了。

对于已经在系统设置项中开启硬件加速,但是硬件加速会给应用程序带来问题的情况,可以使用如下方法为应用程序View级别取消硬件加速

      
  1. mView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

这里有篇非常棒的文章:

转载时请注明出处和作者联系方式: http://mogoweb.net/archives/%E2%80%9Dhttp://mogoweb.net%E2%80%9D mogoweb@gmail.com

本文的主要内容来自SDK文章的"Hardware Acceleration”.

从Android 3.0开始,Android的2D渲染管线可以更好的支持硬件加速。硬件加速使用GPU进行View上的绘制操作。

硬件加速可以在一下四个级别开启或关闭:

  • Application
  • Activity
  • Window
  • View

Application级别

往您的应用程序AndroidManifest.xml文件为application标签添加如下的属性即可为整个应用程序开启硬件加速:

<application android:hardwareAccelerated="true" ...>

Activity级别

您还可以控制每个activity是否开启硬件加速,只需在activity元素中添加android:hardwareAccelerated属性即可办到。比如下面的例子,在application级别开启硬件加速,但在某个activity上关闭硬件加速。

<application android:hardwareAccelerated="true"> <activity ... /> <activity android:hardwareAccelerated="false" /></application>

Window级别

如果您需要更小粒度的控制,可以使用如下代码开启某个window的硬件加速:

getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

注:目前还不能在window级别关闭硬件加速。

View级别

您可以在运行时用以下的代码关闭单个view的硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

注:您不能在view级别开启硬件加速

为什么需要这么多级别的控制?

很明显,硬件加速能够带来性能提升,android为什么要弄出这么多级别的控制,而不是默认就是全部硬件加速呢?原因是并非所有的2D绘图操作支持硬件加速,如果您的程序中使用了自定义视图或者绘图调用,程序可能会工作不正常。如果您的程序中只是用了标准的视图和Drawable,放心大胆的开启硬件加速吧!具体是哪些绘图操作不支持硬件加速呢:

  • Canvas

    • clipPath()
    • clipRegion()
    • drawPicture()
    • drawPosText()
    • drawTextOnPath()
    • drawVertices()
  • Paint
    • setLinearText()
    • setMaskFilter()
    • setRasterizer()

另外还有一些绘图操作,开启和不开启硬件加速,效果不一样:

  • Canvas

    • clipRect(): XORDifference和ReverseDifference裁剪模式被忽略,3D变换将不会应用在裁剪的矩形上。
    • drawBitmapMesh():colors数组被忽略
    • drawLines():反锯齿不支持
    • setDrawFilter():可以设置,但无效果
  • Paint
    • setDither(): 忽略
    • setFilterBitmap():过滤永远开启
    • setShadowLayer():只能用在文本上
  • ComposeShader
    • ComposeShader只能包含不同类型的shader
    • ComposeShader不能包含ComposeShader

Android的绘制模型

开启硬件加速后,Android框架将采用新的绘制模型。基于软件的绘制模型和基于硬件的绘制模型有和不同呢?

基于软件的绘制模型

在软件绘制模型下,视图按照如下两个步骤绘制:

1. Invalidate the hierarchy(注:hierarchy怎么翻译?)

2. Draw the hierarchy

应用程序调用invalidate()更新UI的某一部分,失效(invalidation)消息将会在整个视图层中传递,计算每个需要重绘的区域(即脏区域)。然后Android系统将会重绘所有和脏区域有交集的view。很明显,这种绘图模式存在缺点:

1. 每个绘制操作中会执行不必要的代码。比如如果应用程序调用invalidate()重绘button,而button又位于另一个view之上,即使该view没有变化,也会进行重绘。

2. 可能会掩盖一些应用程序的bug。因为android系统会重绘与脏区域有交集的view,所以view的内容可能会在没有调用invalidate()的情况下重绘。这可能会导致一个view依赖于其它view的失效才得到正确的行为。

基于硬件的绘制模型

Android系统仍然使用invalidate()和draw()来绘制view,但在处理绘制上有所不同。Android系统记录绘制命令到显示列表,而不是立即执行绘制命令。另一个优化就是Android系统只需记录和更新标记为脏(通过invalidate())的view。新的绘制模型包含三个步骤:

1. Invalidate the hierarchy

2. 记录和更新显示列表

3. 绘制显示列表

关于android 手机硬件加速问题相关推荐

  1. ART简单体验和Android图形硬件加速分析

    原文链接:http://www.soomal.com/doc/10100004760.htm 平均/总评分:08.02/505 相关资料 收藏此图 相关图片 Android ART Android A ...

  2. Android HWUI硬件加速模块浅析

    原址 什么是硬件加速(What) 传统软件的UI绘制是依靠CPU来完成的,硬件加速就是将绘制任务交由GPU来执行.Android系统负责硬件加速的模块主要是HWUI,如下图所示: 为什么要硬件加速(W ...

  3. android开发 硬件加速,Android 开发之硬件加速

    (1)定义 所谓硬件加速,指的是把某些计算工作交给专门的硬件来做,而不是和普通的计算工作一样交给 CPU 来处理.这样不仅减轻了 CPU 的压力,而且由于有了专门硬件的处理,这份计算工作的速度也被加快 ...

  4. android 加速 图像处理,Android之硬件加速

    所谓硬件加速,指的是把某些计算工作交给专门的硬件来做,而不是和普通的计算工作一样交给CPU 来处理.这样不仅减轻了 CPU 的压力,而且由于有了「专人」的处理,这份计算工作的速度也被加快了.这就是「硬 ...

  5. Android 模拟器硬件加速

    转载自: https://software.intel.com/en-us/blogs/2012/03/12/how-to-start-intel-hardware-assisted-virtuali ...

  6. android view硬件加速,Android TextureView和硬件加速

    我正在尝试实现 this page上显示的示例.我已经尝试了运行android 4及更高版本的三个不同设备,并且在所有情况下,我都会看到带有此警告的黑屏: 01-27 20:01:22.683: W/ ...

  7. Android 关闭硬件加速时,导致一些问题

    当我们在中配置AndroidManifest中配置硬件加速 android:hardwareAccelerated="false",此时硬件加速已关闭,在我的开发过程中,我发现关闭 ...

  8. android 关闭硬件加速

    特别在自定义View的时候,会需要将android机子的硬件加速关掉,这时候可能想到的就是在AndroidManifest.xml的中设置android:hardwareAccelerated=&qu ...

  9. Android 关闭硬件加速功能

    关闭某一个控件的硬件加速功能 findViewById(R.id.btn).setLayerType(View.LAYER_TYPE_SOFTWARE,null); 关闭一个Activity的硬件加速 ...

最新文章

  1. 【html】【13】特效篇--下拉导航
  2. 2021第12届蓝桥杯省赛 -- 填空题:试题B:直线
  3. kickstart自动化安装
  4. 木兰编程语言python_国产编程语言木兰换皮Python 中科院重罚当事人
  5. uipath sequence传递参数_多孔材料测试及声学参数识别(中)_多孔材料声学参数正向识别...
  6. Linux目录的可写意味着,Linux权限分析 - osc_h5427nyq的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. python学习之路-day8
  8. anaconda中安装xgboost_在windows64位Anaconda3环境下安装XGBoost
  9. web.config从.net framework3.5向4.0迁移注意事项
  10. 如何c语言看字节大小,如何计算C语言结构占用的字节数
  11. 【Appdata】appdata文件夹太大,移动到D盘。
  12. Cesium 加载实景三维模型 优化建议
  13. 与计算机相关的潜在健康风险是什么,医疗安全与风险管理.新.ppt
  14. 英特尔 back,全新架构 coming
  15. Cropper使用(图片裁切)
  16. ubuntu16.04对比工具Meld安装和使用
  17. Redis实现分布式锁(setnx、getset、incr)以及如何处理超时情况(一)
  18. HDU 4417 Super Mario(离线线段树or树状数组)
  19. 如何让邮件变的更安全?邮箱安全中心在哪里?
  20. 安卓手机主题软件_安卓手机数据恢复软件——FonePaw Android Data Recovery Mac

热门文章

  1. ARM指令——跳转指令
  2. 【转】浅谈程序猿的职业规划,看你如何决定自己的未来吧。
  3. 关于ExecuteNonQuery() 方法
  4. EMC电磁兼容测试服务包括
  5. 30套最实用JAVA学习视频教程合集
  6. Teradata 记事本
  7. DrGraph - 新起点
  8. Windows驱动开发之第一个驱动程序
  9. 色差计算(颜色之间的相似度计算)
  10. 自由空气间隙,爬电距离计算~~最便宜的ESD防护方法