发现自己的手机上某个界面出现了花屏,某些控件背景被拉伸过多遮住了其他控件,很难看。这种现象高概率出现,分析了下发现:一旦发生这种现象,必然会打印下面这种log,google了下,这种log应该是硬件加速引入的。在从view层级关闭了硬件加速开关之后,问题没有再出现。

D/OpenGLRenderer(10887): GL error from OpenGLRenderer: 0x501
E/OpenGLRenderer(10887): GL_INVALID_VALUE

硬件加速开关是android3.0开始引入的,大致有个印象,但是我们代码中并没有打开过硬件加速开关。自己写了个demo,log显示硬件加速开关确实已经被打开。看来是google做了些什么,去官方文档上看了看,有下面一句话:
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.
到这里,硬件加速开关打开的原因找到了,为什么在这个应用的这个界面才会引入问题呢。
先学习下android硬件加速的一些概念再说。android自3.0引入了硬件加速,即使用GPU进行绘图,旨在得到更加平滑的动画更加平滑滚动,和更好的总体性能和响应用户的交互。但是硬件加速并不能完善的支持所有的绘图,通常表现为内容不可见,异常或渲染错误。一般出现了问题,就需要关闭硬件加速开关。为了方便控制硬件加速开关,android在四个层面提供了支持:
1.Application level:在AndroidManifes文件中给application标签增加如下配置语句,即可打开硬件加速开关,这个开关对整个应用起作用。

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

2.Activity level:同样还是在AndroidManifes文件中,给activity标签增加如下配置语句,即可关闭硬件加速开关,这个开关对当前activity起作用,可以覆盖1中的application开关:

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

3.Window level:在代码中增加下面代码,即可在窗口级别打开硬件加速开关。注意在窗口级别,只能打开硬件加速开关,不能关闭,不同上面1,2。

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

4.View level:在代码中给view设置如下属性,即可从view层级关闭硬件加速开关。在这里只能关闭硬件加速开关,不能打开。这个层面决定权是最高的,可以覆盖上面三个级别。

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

到这里还是不清楚为什么只有这个界面的view发生了问题。这个view不是应用覆盖重写的,并不复杂。看了下google后面提供的一些高效使用硬件加速开关的技巧:
Reduce the number of views in your application
Avoid overdraw
Don't create render objects in draw methods
Don't modify shapes too often
Don't modify bitmaps too often
后来打开android开发人员选项的检查是否过度绘制的功能,发现这个界面有很明显的过度绘制。到这里基本可以得出,这个界面由于打开硬件加速器高概率出现花屏,应该是违反了第二条:Avoid overdraw。去看了下google的Android Drawing Models说明,还是没有从根本上弄清楚硬件加速是怎么一个回事。没有从代码上看到这些总是感觉不太清楚,不过对于硬件加速了解到这里已经足够解决开发过程中遇到的问题。最后补充说明在分析上述的花屏问题时,发现将.9图片去掉换成普通资源,该问题也会得到修正。

android硬件加速器及其问题小结相关推荐

  1. 硬件加速器为人工智能应用服务

    硬件加速器为人工智能应用服务 Hardware accelerators serve AI applications 硬件加速器(Hardware accelerators)是用于执行特定任务(如对对 ...

  2. Android技能树 — 树基础知识小结(一)

    前言: 现在安卓面试,对于数据结构的问题也越来越多了,也经常看到别人发的面试题都是问什么红黑树,二叉树查找等,所以我们虽然不会马上就会各种难的面试题,但起码树的基础知识还是要会的,这样才能去进一步学. ...

  3. VT-x/AMD-V 硬件加速器已被启动,但当前处于无效状态

    今天在virtualboxvbox中安装64位centos6.5时出现以下错误: VT-x/AMD-V硬件加速器已被启动,但当前处于无效状态.您虚拟电脑内的操作系统将无法检测到64位的CPU,因此也将 ...

  4. Android 系统(175)---Android硬件加速原理与实现简介

    Android硬件加速原理与实现简介 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到"硬件加速"这个词.由于操作系统对底层软硬件封装非常完善,上层软件开发者往往 ...

  5. Android 系统(66)---Android硬件加速相关问题总结

    Android硬件加速相关问题总结 从Android 3.0开始就支持硬件加速,充分利用GPU的特性,使得绘制View的时候更加平滑.例如在ListView(GridView)或者WebView中使用 ...

  6. Android 自定义组合控件小结

    Android 自定义组合控件小结 引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控 ...

  7. Android硬件开发------计步传感器

    在上一节<Android硬件开发------传感器介绍>中,简单介绍了Android手机的传感器类型,通过SensorManager引出传感器的使用方法,通过注册监听器,监听传感器返回的参 ...

  8. [学习记录]浅谈Android硬件加速

    最近看了一些Android硬件加速的文章,因此做个记录与总结 众所周知 ,如果使用GPU进行图形绘制,就认为是硬件减速绘制:反之,则是软件绘制. 以平时开发举例,实现一个圆角矩形按钮通常有两种方案:使 ...

  9. android+硬件服务,android之硬件访问服务框架

    一.硬件接口描述文件aidl 新增\frameworks\base\core\java\android\os\ILedService.aidl 二.mk编译脚本 修改vi frameworks/bas ...

最新文章

  1. 使用微信的JS-SDK实现自定义分享到微信朋友圈
  2. NYOJ 366 D的小L
  3. Android实时监听网络状态
  4. 腾讯上海某实验室SQL面试题——查询最后任职信息
  5. python 生成式,迭代器,生成器
  6. 达梦工作笔记-使用达梦客户端创建用户并授予权限
  7. 【kafka】Kafka JMX监控报错 Failed to get broker metrics for BrokerIdentity
  8. android 原生开发 3d地图 下载_arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)...
  9. poj2406 Power Strings 模式匹配算法KMP变形
  10. 【收藏】一千行 MySQL 学习笔记
  11. JAVA NP插件,特定的宽度600,插件就不显示
  12. 两个平面之间的关系—平行、垂直、相交
  13. OCR 常用软件对比
  14. 四年背的单词 笔记目录
  15. RestTemplate.exchange各种用法(包括泛型等 --全)
  16. 桌面图标变白,任务栏图标变白
  17. Win XP iis组件补丁(ghost xp)iis5.1
  18. 修改 navigator.platform 的值
  19. oculusHome 无法登录提示显示错误 ovr....
  20. CSS font-style斜体字体倾斜体样式

热门文章

  1. 剑指offer(C++)-JZ27:二叉树的镜像(数据结构-树)
  2. 华为机试HJ80:整型数组合并
  3. 编写php代码老出错,SQL出错原因比较(php代码)
  4. java 为何 无效_java – 为什么compareTo无效导致Collections.sor...
  5. mybatisplus service insert 空指针_c++ 图解层序遍历和逐层打印智能指针建造的二叉树...
  6. 面试小能手速成,接口测试脚本如何编写?其实很简单
  7. zemax设置 像方远心_[入门] [ZEMAX] [成像] 手把手教程:一个双高斯类镜头
  8. python实践项目(二)
  9. 什么是存储过程,存储过程的作用及好处
  10. (四)Linux 安装 jdk