原标题:Android系统图像渲染简介

Android系统UI从绘制到显示至屏幕一般为如图过程:先从相应的图片解码获得位图数据放到内存。然后使用图形引擎将位图数据按一定方式,渲染到可用于显示的图形内存上。最后系统SurfaceFlinger汇集所有图层的信息,采用离线合成或在线合成的方式,将图形内存的内容最后投射到屏幕显示出来。而本文就其中所用到的渲染方式作下简单介绍。

软件渲染

Android程序中图形绘制单元为一个Surface。每个Surface都有一个Canvas对象,它封装了由Skia提供的2D UI绘制接口,用来完成View在Surface上的绘制操作。每个Surface上的绘制内容就存储在DequeueBuffer一个Graphic Buffer中。每当窗口绘制时,通过函数lockCanvas获得一个Canvas,然后从顶层View开始,按树递归调用View的draw方法,在draw方法中,所有View中的onDraw实现被调用,以完成整个View的绘制,最后调用函数unlockAndPost将数据送至QueueBuffer一个Graphic Buffer中,以便SurfaceFlinger可以对Graphic Buffer的内容进行合成后显示到屏幕上去。

软件渲染流程中,Android并不会计算哪些View需要重绘,不只绘制了dirty的View,而是让所有View执行onDraw方法,这样效率不高,一定程度上影响了程序相应速度。而硬件渲染,通过GPU对软件图形图像的处理来减轻CPU的负担,从而使图像能够以更快的速度被处理,以达到程序提速的目的。

硬件渲染

硬件渲染即通过GPU,对厂商按照Open GL的规范实现的驱动间接调用来进行渲染。硬件渲染和软件渲染主要流程一样,在开始渲染之前,先获得一个Graphic Buffer但是这个Graphic Buffer会被封装成一个ANativeWindow。如同可以将Surface看作是Skia图形渲染库与操作系统底层图形系统的一个桥梁,同样可以将它看做是Open GL与底层图形系统建立的一个连接。然后将这个ANativeWindow传递给Open GL进行硬件加速渲染环境初始化。之后就可以调用Open GL的API进行UI绘制了,并将绘制出来内容就保存在前面获得的Graphic Buffer中。当绘制完毕,Android应用程序再调用libegl库提供的eglSwapBuffer接口将绘制好的UI显示到屏幕中。

其中与软件渲染不同的是,硬件渲染并不是立即执行绘制命令,它只是将对应的绘制命令以及参数保存在一个Display List中,接下来再通过Display List Renderer执行这个Display List的命令。使用Display List的目的是,先把视图的各种绘制函数翻译成绘制指令保存起来,对于没有发生改变的视图把原先保存的操作指令重新读取出来重放一次就可以了,提高了视图的显示速度,而对于需要重绘的View,则更新显示列表,然后再调用Open GL完成绘制。

虽然有了GPU的介入,分担了CPU的工作,同时有了Display List优化了图形渲染处理的流程,但是布局和事件响应还是全部集中在主线程,有时还是比较容易造成阻塞,于是又有了非主线程渲染。

非主线程渲染

在UI的主线程中更新画面很容易造成主线程的堵塞,造成程序的长时间无响应,于是便有了SurfaceView。

SurfaceView是View的一个特殊子类,它拥有专有的Surface,即请求Window Manager创建一个新窗口,并改变窗口之间的深度信息来显示。如果SurfaceView的Window显示在主窗口的后面,SurfaceView将主窗口相应的位置设置成透明来使可见。其中的SurfaceHolder,可以把它当成surface的控制器,用来操纵surface,处理它的Canvas上画的效果和动画,控制表面,大小,像素等。

总结

为了总体提高系统显示性能,Android系统也是不断的对渲染性能这块进行改进。

在Android 1.5中,GLSurfaceView作为SurfaceView的补充,加入了EGL的管理,并自带了渲染线程。此前要在SurfaceView中要用GPU渲染,只好自已建上下文,而如今只要在回调中调用Open GL接口就可以了。

从Android 3.0开始支持启用Open GL硬件绘制加速。同时引入了SurfaceTexture,它是一个Texture, 也就是纹理,可以用来捕获一个图像流的一帧来作为OpenGL 的纹理。这个图片流主要是来自相机的预览或视频的解码。

之后Android 4.0中又增加一个TextureView控件,跳过Display List中间层,支持直接以Open GL纹理的形式来绘制UI,从而提高效率。同时它不会创建独立的window,它与常规的View一样,弥补了SurfaceView在进行普通View的旋转、缩放等变化时,其内容并不跟着一起变化的缺陷。

Android 4.3 增加了对Open GL ES 3.0 的支持,这个版本增加了对多缓冲区对象的支持;着色语言支持32 位整数和浮点数据类型以及操作;增加了对多个纹理与多重目标渲染的支持。这些新特新大幅提高了移动平台的渲染性能。

到了Android 5.0,更是增加了一个专门负责UI渲染UIRender Thread,用来分担Android Main Thread的工作,在此之前,Android的Main Thread不仅负责渲染UI,还负责处理用户输入,而通过引进Render Thread来处理渲染工作,Main Thread可以更高专注高效地处理用户输入,这样使得在提高UI绘制效率的同时,也使得UI具有有更高的响应性。

Android 6.0后又提供了一个lockHardwareCanvas方法,用此方法可以直接得到硬件加速的Canvas。

在Android7.0之前,Surfaceview的显示也不受View的属性控制,所以不能进行平移,缩放等变换,要实现上述功能,要借助于TextureView。而到了Android 7.0时,它对SurfaceView自身和它的内容改变做了同步处理,比如通过SurfaceView实现视频播放时,对视频进行缩放变换SurfaceView会同步变化。

Android 应用图像展示的流畅性直接影响着用户体验,而本文从软件渲染,硬件渲染,非主线程渲染三个方面,对其各自的特点和流程作了简单介绍,在以后需要优化渲染性能时,我们可以选择从其一方面或多方面结合入手,来满足自己的需求。

本文作者:钱康(点融黑帮),就职于点融大前端,android开发工程师。

责任编辑:

Android渲染画面,Android系统图像渲染简介相关推荐

  1. Android渲染画面,Android界面渲染优化

    上篇介绍了android界面渲染主要是Display的过程,只要在一个时间段也就是16ms中,CPU和GPU不能正常处理完数据就会产生卡顿. 而 CPU(中央处理器) :多缓存多分支,适用于复杂的逻辑 ...

  2. 【图像加密】DNA混沌系统图像加密【含Matlab源码 1190期】

    ⛄一.DNA混沌系统图像加密简介 基于DNA编码的图像加密,采用将图像分块进行DNA编码,通过CHEN超混沌系统产生密钥,进行特殊的DNA运算后解码得到加密后的图像. Logistic混沌置乱,先不说 ...

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

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

  4. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

    文章目录 一. 背景设置产生的过度绘制 二. Android 系统的渲染优化 1. 透明组件数据传递 2. GPU 存储机制 3. Android 7.0 之后的优化机制 三. 自定义布局渲染优化 一 ...

  5. [Android 基础] -- Android 属性系统简介

    一.简介 在 android 系统中,为同一管理系统的属性,设计了一个统一的属性系统.每个属性都有一个名字和值,他们都是字符串格式.属性被大量使用在 Android 系统中,用来记录系统设置或进程之间 ...

  6. Android基础入门教程——8.3.13 Paint API之—— Shader(图像渲染)

    Android基础入门教程--8.3.13 Paint API之-- Shader(图像渲染) 标签(空格分隔): Android基础入门教程 本节引言: 最近一段时间因为工作上的事以及面试等等,耽误 ...

  7. 微信小游戏直播在Android端的跨进程渲染推流实践

    本文由微信开发团队工程师"virwu"分享. 1.引言 近期,微信小游戏支持了视频号一键开播,将微信升级到最新版本,打开腾讯系小游戏(如跳一跳.欢乐斗地主等),在右上角菜单就可以看 ...

  8. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )

    文章目录 一. GPU 过度绘制优化总结 二. CPU 渲染过程 三. CPU 渲染性能调试工具 Layout Inspector 四. Layout Inspector 组件树 DecorView ...

  9. Android基础——Android系统概览

    1. Android系统架构 android大致可以分为四层架构:Linux内核层,系统运行库层.应用框架层和应用层 Linux内核层 android系统是基于Linux内核,这一层为android设 ...

最新文章

  1. html5 ar开发,HTML5 WebAR开发
  2. 挑战61年未被质疑的经典心理学理论—— 大脑识别图像并非“趣味导向”
  3. matlab_EDA 数据球面化
  4. 编程之美-饮料供货方法整理
  5. HDU 1285 - 确定比赛名次(拓扑排序)
  6. Spark机器学习(3):保序回归算法
  7. Docker 私有仓库registry
  8. C#从新浪新闻上提取新闻标题
  9. Unity3D 中 用quaternion 来对一个坐标点进行旋转的初步体会
  10. 竹间智能B轮3000万美元融资,打造业内领先的对话机器人及多模态情感计算平台...
  11. ospf 默认路由综合配置
  12. python︱Anaconda安装、简介(安装报错问题解决、Jupyter Notebook)
  13. Microsoft Office Communications Server 2007排错日志
  14. SQL2005学习(三十二),Group by
  15. 解决在DHCP环境下私自指定IP和私自搭建DHCP服务器的方法
  16. win10计算机分盘怎么设置密码,Win10如何限制磁盘分区被访问 Win10自带磁盘加密功能BitLocker在哪里...
  17. SQL 当天在当月、当季度、当年的时间进度
  18. 探索Holo_java操作日期
  19. 现代信号处理教程第二版(胡广书)学习笔记
  20. 计算机编程序专业,计算机编程方向专业

热门文章

  1. 基于ASP.NET的旅游网站
  2. C语言实验指导 P20 齿轮啮合
  3. 互联网大数据“比你更懂你” 但是也可能“杀熟”没商量
  4. 机器视觉检测丨圆顶光源工作原理及打光案例
  5. exlc表格怎么换行_Excel电子表格怎么在一个单元格里面另起一行
  6. 怎么理解后App时代的轻应用技术
  7. mysql函数如何调用过程_MySQL调用存储过程和函数
  8. 餐厅的人效该怎么计算?
  9. python画黑白线条_python出“黑白”曲线图、柱状图(写黑白论文用)
  10. Python入门:对Excel数据处理的学习笔记【第十一章】openpyxl库的使用