一、 问题描述

GLSurfaceView运行期间抛出OOM崩溃:

07-22 11:47:19.919 24862 25042 W Adreno-GSL: <sharedmem_gpuobj_alloc:2713>: sharedmem_gpumem_alloc: mmap failed errno 12 Out of memory
07-22 11:47:19.920 24862 25042 E Adreno-GSL: <gsl_memory_alloc_pure:2297>: GSL MEM ERROR: kgsl_sharedmem_alloc ioctl failed.
07-22 11:47:19.921 24862 25042 E OpenGLRenderer: GL error:  Out of memory!
07-22 11:47:19.921 24862 25042 F OpenGLRenderer: GL errors! frameworks/base/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp:138

二、 问题原因

这个问题在Google上一搜一大堆,没有明确的解释native层如何引起崩溃,先大致回顾以下绘制流程:

开启硬件加速后,会创建Render Thread,当Vsync信号来到时,执行Choreographer中的traversal这个callback,即UI线程绘制操作,绘制操作会被记录到DisplayList中,同步到Render线程,并渲染出最终的buffer,交给SurfaceFlinger去合成,最终展示在显示屏上。

而该OOM问题对应的SkiaOpenGLPipeline,位于上述Render线程的渲染过程中,再往下分析我也不知道了,本文不对其深入分析,因为无论native因什么导致OOM,归根结底还是OOM问题,我们关心的是如何去解决它。


三、 解决方案

1. 限制使用硬件加速

Android提供了四种级别的硬件加速控制方式:

  • Application:在Manifest文件中的Application Tag中配置属性:
<application android:hardwareAccelerated="true" ...>
  • Activity:在Manifest文件中的Activity Tag中配置属性:
<activity android:hardwareAccelerated="true" ...>
  • Window:运行时对窗口设置flag使其使用硬件加速:
window.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
  • View:运行时对单个View设置层级类型使其停用硬件加速:
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

开启硬件加速,是为了充分利用GPU提升渲染性能,但是并非所有场景都需要使用硬件加速,除了通常的Video、WebView、Canvas等场景,其他常规页面不涉及高频刷新的,应该尽量缩小硬件加速的使用范围,将GPU资源更多地分配给真正需要的场景。


2. 避免过度绘制

我们知道,无论一个显示区域有多少图层、多少视图组件,最终通过SurfaceFlinger进行合成后都是一个2D平面图,而那些被遮挡的视图或图层,就成了无效绘制,因为一开始对其的计算将被它上方覆盖,不仅在遍历View树时造成额外开销,也在合成buffer时成了累赘。

避免过度绘制既要减少图层,即布局的嵌套层次,也要减少视图数量,以提升单帧的合成效率。


3. 谨慎使用Alpha

以Activity为例,栈上方的页面如果不是完全不透明的,那么栈下方的Activity可以继续绘制,这就意味着同时渲染两个页面的内容,开销直接翻倍。同样的,单个视图如果是半透明的,也会造成该额外开销。

因此尽量避免半透明大视图,如果实在要使用,那就设置该视图的层级属性为硬件层。


4. 确保有足够的内存

前面所说都是从源头出发,避免OpenGL的过大负担,这一条则是从问题本身角度进行优化,内存不足,那么就想办法让内存尽可能满足。

优化内存主要从以下几个维度考虑:

  • 避免ML。
  • 控制大内存的申请,以Bitmap为例,裁剪大小、降低分辨率、调整编码格式等都可以在创建时减小内存占用,如果是应用内的资源,压缩图片或者使用矢量图代替,也是一种不错的方式。
  • 在内存峰值时及时回收内存。

四、 参考文献

  • 一次OOM纪实
  • Hardware acceleration
  • Android Systrace 基础知识 - MainThread 和 RenderThread 解读
  • Android 基于 Choreographer 的渲染机制详解
  • Android P 图像显示系统(三)Android HWUI 绘制流程

OpenGL OOM的解决方案相关推荐

  1. Android系统(134)--- Android关于OOM的解决方案 ##OOM

    Android关于OOM的解决方案 ##OOM 内存溢出(Out Of Memory) 也就是说内存占有量超过了VM所分配的最大 ##出现OOM的原因 加载对象过大 相应资源过多,来不及释放 ##如何 ...

  2. 一文了解OOM及解决方案

    本文来自: https://bloggceasy.files.wordpress.com/2015/05/outofmemoryerror2.pdf 1. Java 堆空间 发生频率:5颗星 造成原因 ...

  3. Android Glide加载大量图片,出现OOM问题解决方案

    1.引入largeHeap属性,让系统为App分配更多的独立内存. 在AndroidManfiest.xml文件的 applaction标签下加入 android:largeHeap="tr ...

  4. 一文了解OOM及解决方案,成功入职字节跳动

    一.内存与线程 1.内存结构 内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平.JVM的内存结构规定Java程序 ...

  5. 一文了解OOM及解决方案,你还看不明白?

    InnoDB总体结构 首先我们来看官网的一张图(图片来源于MySQL官网): 从上图中可以看出其主要分为两部分结构,一部分为内存中的结构(上图左边),一部分为磁盘中的结构(上图右边) 内存结构 Inn ...

  6. 借花献佛!一文了解OOM及解决方案,终局之战

    前言 阿里巴巴,作为国内互联网公司的Top,算是业界的标杆,有阿里背景的程序员,也更具有权威性.作为程序员,都清楚阿里对于员工要求有多高,技术人员掌握的技术水平更是望尘莫及.所以,大厂程序员的很多经验 ...

  7. 数据倾斜原理及解决方案

    导读 相信很多接触MapReduce的朋友对'数据倾斜'这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢? 何为数据倾斜? 在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念 ...

  8. 字节跳动应用性能监控帮助客户Java OOM崩溃率下降80%

    一.前言 如何定位和解决 Android App 因为内存不足(Java OOM)引发的线上问题一直是业界的难题.崩溃现场能抓取到的常规信息中并不包括内存分配详情--不了解内存被谁持有,自然也无法追查 ...

  9. 常见开源软件编译异常解决方案

    CLion加载CMakeList.txt 时,经常会提示一些系统库找不到.此时可以先检查软件包的基本信息,使用指令如下: apt-cache search libuv 通过指令我们可以找到如下信息,从 ...

最新文章

  1. 三年51亿!30岁的TA携「三瑞」打通场景级智慧,走入极「智」医疗
  2. Push rejected: Push to origin/master was rejected错误解决方案
  3. 《剑指offer》第十三题(机器人的运动范围)
  4. php基础语法(文件加载和错误)
  5. 怎么删除计算机c盘应用程序,如何删除C盘的垃圾文件!!
  6. AttributeError: 'numpy.ndarray' object has no attribute 'value_counts'
  7. 老李分享:接口测试之jmeter
  8. python3 面向对象_Python3 面向对象
  9. android support library github,Android Support Library 之 夜间模式
  10. Js获取当前日期时间及其它操作(转)
  11. java volatile 原子性_Java并发编程之验证volatile不能保证原子性
  12. fastrtext︱R语言使用facebook的fasttext快速文本分类算法
  13. 【手写字母识别】基于matlab GUI BP网络手写体大写字母识别【含Matlab源码 183期】
  14. 《剑来》语句摘录(四)
  15. 【STM32F407的DSP教程】第17章 DSP功能函数-定点数互转
  16. 替换Word文档里面的多个空格
  17. 什么是Monitor?
  18. 用Hadoop构建电影推荐系统
  19. 容斥原理和概率与数学期望
  20. 第二十九章 狼心狗肺

热门文章

  1. AT91SAM9260——NFS挂载根文件系统
  2. 了解描述页模板,让你的宝贝人气高涨1
  3. 无线网络基础知识要点概括
  4. java:实现根据等级计算折扣比例(附完整源码)
  5. 常见的12个深度学习面试问题
  6. 图片清晰度增强(锐化)方法浅探 - 拉普拉斯算法和高斯算法(c++ opencv)
  7. Tableau图表维度上卷下钻制作方法
  8. 解决打开CentOS时出现Cannot connect virtual device ide1:0导致电脑重启蓝屏问题
  9. mysql中平方米显示不出来_MySQL - 添加外键
  10. 管理者十句最不应该说的话