当前位置: 首页 > article >正文

Android显示原理

Android应用程序的显示过程包含了两个部分(应用侧绘制、系统侧渲染)、两个机制(进程间通讯机制、显示刷新机制)。

二、应用侧绘制


一个android应用程序窗口里面包含了很多UI元素,这些元素是以树形结构来组织的,即它们存在着父子关系,其中,子UI元素位于父UI元素里面。

因此,在绘制一个android应用程序窗口的UI之前,首先要确定里面的各个子UI元素在父UI元素里面的大小和位置。确定各个子UI元素在父UI元素里面的大小以及位置的过程有称为测量过程和布局过程。因此,android应用程序窗口的UI渲染过程可以分为测量、布局和绘制三个阶段。

测量:递归(深度优先)确定所有视图的大小(宽、高)

布局:递归(深度优先)确定所有视图的位置(左上角坐标)

绘制:在画布canvas绘制应用程序窗口的所有视图

三、系统侧渲染


android应用程序在图形缓冲区中绘制好View层次结构后,这个图形缓冲区会被交给SurfaceFlinger服务,而SurfaceFlinger服务再使用OpenGL图形库API来将这个图形缓冲区渲染到硬件帧缓冲区中。

android图像显示的底层原理:

CPU:作用是计算图片的形状和文字的纹体

GPU:功能是渲染图像的颜色

Display:屏幕显示图像

Vsync:垂直同步信号,显卡输出频率与屏幕刷新频率同步的信号

android图像在绘制的时候,首先是CPU计算出图像形状,计算完成CPU会将图像交给GPU渲染出颜色,如果这一切都能够在16ms内完成,那么在下一个VSync出现时,就能显示刚刚渲染出来的那一帧图像了。但是如果CPU和GPU处理一帧图像时间超过16ms,那么这帧图像只能等到第二个VSync出现时才能刷出屏幕,呈现给用户了,这就意味着用户在32ms内所看到的是同一帧图像,这就是所谓的掉帧,也就是卡顿了。

四、进程间通讯机制


android应用程序为了能够将自己的UI绘制在系统的帧缓冲区上,它们就必须要与Surface服务进行通信。

android应用程序与SurfaceFlinger服务是运行在不同的进程中的,因此,它们采用某种进程间通信机制来进行通信。由于android应用程序在通知SurfaceFlinger服务来绘制自己的UI的时候,需要将UI数据传递给SurfaceFlinger服务,例如,要绘制UI的区域、位置等信息。一个android应用程序可能会有很多个窗口,而每一个窗口都有自己的UI数据,因此,android系统的匿名共享内存机制就派上用场了。

每一个android应用程序与SurfaceFlinger服务之间,都会通过一块匿名共享内存来传递UI数据。但是单纯的匿名共享内存在传递多个窗口数据时缺乏有效的管理,所以匿名共享内存就被抽象为一个更上流的数据结构SharedClient。

在每个SharedClient中,最多有31个SharedBufferStack,每个SharedBufferStack都对应一个Surface,即一个窗口。一个SharedClient对应一个android应用程序,而一个android应用程序可能包含多个窗口,但至多可以包含31个窗口。每个SharedBufferStack中又包含了N个缓冲区(android4.1以下,N = 2,4.1以上,N = 3),即显示刷新机制中即将提到的双缓冲和三缓冲技术。

五、显示刷新机制

一般我们在绘制UI的时候,都会采用一种称为“双缓冲”的技术。双缓冲意味着要使用两个缓冲区,其中一个被称为Front Buffer,另外一个被称为Back Buffer。UI总是先在Back Buffer中绘制,然后再和Front Buffer交换,渲染到显示设备中。在android4.1中引入了VSync,这类似于时钟中断,每收到VSync中断,CPU就开始处理各帧数据。
关注我,每天分享知识干货,你要的,我都有~~~


http://www.kler.cn/a/536914.html

相关文章:

  • 【leetcode100】岛屿的最大面积
  • Class加载流程和运行时区域
  • Python设计模式 - 原型模式
  • [250202] DocumentDB 开源发布:基于 PostgreSQL 的文档数据库新选择 | Jekyll 4.4.0 发布
  • 金蝶云星空k3cloud webapi报“java.lang.Class cannot be cast to java.lang.String”的错误
  • html的字符实体和颜色表示
  • SqlServer查看锁表与解锁
  • 零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
  • 备赛蓝桥杯之第十五届职业院校组省赛第四题:多表单校验
  • Android开发签名校验
  • 新能源产业的质量革命:六西格玛培训如何重塑制造竞争力
  • uniapp实现人脸识别(不使用三方插件)
  • ISP代理与住宅代理的区别
  • MySQL——数据库的操作
  • 【重新认识C语言----文件管理篇】
  • 【面试场景】MySQL分布式主键选取
  • C++,设计模式,【单例模式】
  • NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理 + ids4鉴权
  • 学习率调整策略 | PyTorch 深度学习实战
  • IntelliJ IDEA新版本的底部version control(或git)里local change窗口显示配置修改详细教程
  • PHP填表统计预约打卡表单系统小程序
  • 配置GitHub和PicGo的详细步骤
  • 通过Python编写的中国象棋小游戏
  • mac 安装 dotnet 环境
  • 嵌入式硬件篇---OpenMV串口通信json字符串
  • Redis | 十大数据类型