史上最全Android渲染机制讲解(长文源码深度剖析)

2023-11-11

前言

渲染机制是Android操作系统很重要的一环,本系列通过介绍应用从启动到渲染的流程,揭秘Android渲染原理。

问题

1.vsync如何协调应用和SurfaceFlinger配合来完成UI渲染、显示,App接收vsync后要做哪些工作?
2.requestLayout和invalidate区别?
3.performTraversals到底是干什么了?
4.surfaceflinger怎么分发vsync信号的?
5.app需要主动请求vsync信号,sw sync才会分发给app?
6.surfaceview显示视频的时候,视频会一直频繁刷新界面,为什么整个UI界面没有卡顿?
7.app是如何构建起上面这套机制的?

如果对于上面的几个问题没有非常确认、清晰的答案可以继续看下去,本文通过详细介绍渲染机制解答上面的问题。

Vsync信号

Android在“黄油计划”中引入的一个重要机制就是:vsync,引入vsync本质上是要协调app生成UI数据和SurfaceFlinger合成图像,app是数据的生产者,surfaceflinger是数据的消费者,vsync引入避免Tearing现象。vsync信号有两个消费者,一个是app,一个是surfaceflinger,这两个消费者并不是同时接收vsync,而是他们之间有个offset。

vsync-offset引入原因

上面提到hw vsync信号在目前的Android系统中有两个receiver,App + SurfaceFlinger,hw sync会转化为sw sync分别分发给app和sf,分别称为vsync-app和vsync-sf。app和sf接收vsync会有一个offset,引入这个机制的原因是提升“跟手性”,也就是降低输入响应延。

如果app和sf同时接收hw sync,从上面可以看到需要经过vsync * 2的时间画面才能显示到屏幕,如果合理的规划app和sf接收vsync的时机,想像一下,如果vsync-sf比vsync-app延迟一定时间,如果这个时间安排合理达到如下效果就能降低延迟:

SufaceFlinger工作机制

组成架构

  1. EventControlThread: 控制硬件vsync的开关

  2. DispSyncThread: 软件产生vsync的线程

  3. SF EventThread: 该线程用于SurfaceFlinger接收vsync信号用于渲染

  4. App EventThread: 该线程用于接收vsync信号并且上报给App进程,App开始画图

  • HW vsync, 真实由硬件产生的vsync信号
  • SW vsync, 由DispSync产生的vsync信号
  • vsync-sf, SF接收到的vsync信号
  • vsync-app, App接收到的vsync信号

应用程序基本架构

Android应用进程核心组成

上图列举了Android应用进程侧的几个核心类,PhoneWindow的构建是一个非常重要的过程,应用启动显示的内容装载到其内部的mDecor,Activity(PhoneWindow)要能接收控制也需要mWindowManager发挥作用。ViewRootImpl是应用进程运转的发动机,可以看到ViewRootImpl内部包含mView、mSurface、Choregrapher,mView代表整个控件树,mSurfacce代表画布,应用的UI渲染会直接放到mSurface中,Choregorapher使得应用请求vsync信号,接收信号后开始渲染流程,下面介绍上图构建的流程。

应用启动流程图(下文称该图为P0)

进程启动

应用冷启动第一步就是要先创建进程,这跟linux类似C/C++程序是一致的,Android亦是通过fork来孵化应用进程,我们知道Linux fork的子进程继承父进程很多的资源,即所谓的COW。应用进程同样会从其父进程zygote处继承资源,比如art虚拟机实例、预加载的class/drawable资源等,以付出一些开机时间为代价,一来能够节省内存,二来能够加速应用性能,下面结合systrace介绍Android如何启动一个应用进程,应用启动第一个介入的管理者是AMS,应用启动过程中AMS发现没有process创建,就会请求zygote fork进程,下图就是AMS中创建进程的耗时:

AMS(ActivityManagerService)请求zygote创建进程的流程如下:

##ActvityManager:startProcessLocked

private final void startProcessLocked(ProcessRecord app, String hostingType,
  String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {

    boolean isActivityProcess = (entryPoint == null);
    if (entryPoint == null) entryPoint = "android.app.ActivityThread";
    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +app.processName);
    checkTime(startTime, "startProcess: asking zygote to start proc");
    ProcessStartResult startResult;
    if (hostingType.equals("webview_service")) {
    startResult = startWebView(entryPoint,
      app.processName, uid, uid, gids, debugFlags, mountExternal,
            app.info.tar
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

史上最全Android渲染机制讲解(长文源码深度剖析) 的相关文章

随机推荐

  • 设计模式6-命令模式(Command)解析+案例实践+总结

    本文是对面向对象设计模式 命令模式 Command 的解析 主要分为定义解析 通过餐厅点餐案例 遥控器案例讲解命令模式 多案例练习加深对命令模式的理解 最后总结知识要点 第一篇 定义解析 命令模式是GoF四人帮整理的 设计模式 可复用面向对
  • mysql语句声明外键

    环境 在Navicat 中进行mysql的语句操作 示例 1 创建一张员工表 CREATE TABLE employ id INT PRIMARY KEY ename VARCHAR 20 deptId INT 2 插入员工数据 INSER
  • NodeJs的应用场景及实践

    前几天看到一篇文章 据说是WordPress4 3将用NodeJs重写 着实让人有点惊讶 后来了解到 其实并不是完全摒弃PHP 而是由NodeJs重写部分核心类 具体文章链接来源 附上链接 WordPress 4 3 将用 Node js
  • 驱动怎么学

    1 什么是驱动 1 1理解驱动的概念 1 驱动一词的字面意思 驱动就是让一个东西动起来 给一个东西动力 让它动起来 2 物理上的驱动 比如 一个球放在那儿没动 你踢了一下它 给了它一个力 给了力之后它就能动 就说明你驱动了它 这就是物理学上
  • 召唤神龙无敌版,轻松召唤神龙~

    还在被鲨鱼围着追吗 快来试试无敌版轻松通关 最新召唤神龙无敌版 地址 http minigame suyiboke com zhaohuanshenlongwdb index html 备用地址 推荐 https suyiboke com
  • osg与opengl中向量、矩阵的区别

    osg中的向量是行向量 矩阵相应也是与行向量对应 v M 矩阵最后一行对应的是平移 其它行列对应旋转和缩放 对角线元素值对应缩放值 inline void Matrixd preMultTranslate const Vec3d v for
  • GENERIC NETLINK 介绍及使用

    之前一篇博文讲述了Netlink如何使用 当时我们是自己定义了一种协议NETLINK TEST进行用户进程和内核的通信 这篇文章就讲一下如何使用内核为我们提供的NETLINK GENERIC进行通信 如果把Netlink协议比作IP层 那么
  • 从GitHub火到了博客,共计1658页的《Java岗面试核心MCA版》,拿走不谢

    2019年我凭借一份 Java面试核心知识点 成功拿下了阿里 字节 小米等大厂的offer 两年的时间 为了完成我给自己立的flag 拿下一线互联网企业offer大满贯 即使在职也一直在不断的学习与备战面试中 不得不说程序员除了做项目之外
  • 华为8月8日将推出系统云翻新功能:P40/Mate 30系列首发

    7月28日消息 7月28日消息 华为终端公司近日在微博上发布重要公告 宣布将于8月8日推出全新的系统云翻新功能 据悉 该功能将首次应用于华为 P40 系列手机和 Mate30 系列手机 为用户提供更便捷的手机数据备份和恢复体验 系统云翻新功
  • 在ubuntu上安装Ocaml的RPM包的一点经验

    今天想在ubuntu上安装ocaml 3 10 1 1 fc7 src rpm 遇到了一些问题 其实很简单 但是记录下来防止以后忘了 如果输入 sudo apt get install alien ocaml 3 10 1 1 fc7 sr
  • Linux环境下MySQL的数据目录

    MySQL的数据目录 数据库文件的存放路径 MySQL数据库文件的存放路径 var lib mysql mysql gt show variables like datadir Variable name Value datadir var
  • sqlserver链接服务器实现远程联库查询

    1 新建链接服务器 使用SQL Server Management Studio 右键新建链接服务器 在 常规 页面下输入链接服务器名 选择服务器类型为SQL Server 这里看个人需要 在 安全性 页面下选择 使用此安全上下文进行连接
  • 怎样通过一根网线,一台电脑,做到月入过万。

    赚钱 就是开眼 复制 创新 规模 什么是 开眼 看足够多的案例信息 什么是 复制 将底层逻辑为我所用 什么是 创新 取其精华 去其糟粕 什么是 规模 抓住机会 快马加鞭 今天就把我的人脉圈里 做得比较优秀的朋友介绍给大家 希望能给你们带来一
  • 航天生物计算机作文,我与航天作文

    我与航天作文 一觉醒来 又是美好的一天 按照惯例 起床 穿衣服 咦 我的衣服呢 诶 我怎么不在家里 我拖着沉重的眼皮环视四周 咦 怎么都是陨石呢 我发现我已经置身与太空中 并且可以呼吸 我看到了星河 太阳 地球据说 火星上有生命体 但不能肯
  • 用VB调用Webservice

    关键字 VB WebService C 调试环境 vb6 sp5 Vs net 2005 SOAP Toolkit 3 0 在VB中调用Webservice先要安装Soap Toolkit 可以到微软的网站上下载 下载地址为 http ww
  • 在linux系统中离线安装postgresql和postgis亲测可用

    离线用到的包 百度链接 https pan baidu com s 14baq72bveIWMbN89tvEgXQ 提取码 573f 我是把防火墙关了的 方便连接数据库 关闭防火墙 systemctk stop firewalld 一 离线
  • Qt5.4 QDialog窗体圆角时圆角透明背景是黑色的解决方法

    运行环境 framebuffer armlinux系统 qt5 4 设置这两句 setAttribute Qt WA TranslucentBackground setWindowFlags Qt FramelessWindowHint 通
  • 两个数字m、n,输出[1,m]范围内所有和为n的组合

    题目 输入两个数 m n 输出 1 m 范围内所有和为 n 的组合 样例输入 5 3 样例输出 1 1 1 1 2 3 代码 说明 如果要求组合内数字不重复 可以用 getResult i 1 end target i temp impor
  • 人脸识别API/SDK 汇总(转)

    原文地址 https www zhihu com question 19561362 1 face com 以色列公司 某年六月时被Facebook收购 同时暂停了API服务 之前测试过他们的服务 基本上是了解到的应用中做得最牛的了 2 o
  • 史上最全Android渲染机制讲解(长文源码深度剖析)

    前言 渲染机制是Android操作系统很重要的一环 本系列通过介绍应用从启动到渲染的流程 揭秘Android渲染原理 问题 1 vsync如何协调应用和SurfaceFlinger配合来完成UI渲染 显示 App接收vsync后要做哪些工作