Android的UI渲染机制(一)

        应用程序与Surface的关系,从应用程序的Activity开始,一路追踪到ViewRoot、WindowManager Service。

         

        SurfaceFlinger则主要负责视图的显示,其管理多个surface进行图像合成。WindowManager Service由System_Server进程启动,SurfaceFligner也在这个进程中。

        App端copyFrom() 出来 Native Surface 时会创建一个 SharedBufferClient ,其与与 SharedClient 这块共享内存关联。当客户端 addView() 或者需要更新 View 时,会通过 SharedBufferClient写入数据到 ShareClient 中,SurfaceFlinger 中的 SharedBufferServer 接收到通知会将 FrameBuffer 中的数据传输到屏幕上。

        HWComposer 是基于硬件来产生 VSync 信号的,来通知 SurfaceFlinger 重绘,控制显示的帧率。

        接下来,我们来看下一个Android应用从应用程序图标到视图渲染完成的完成过程。

       

  1. zygote进程在响应请求后会fork 一个子进程,这个子进程是App对应的进程,它的入口函数是ActivityThread类的main函数。
  2. ActivityThread类中有一个handleLaunchActivity函数,它就是创建Activity的地方。handleLaunchActivity中用performLaunchActivity返回一个Activity,其作用有以下两点:根据类名以Java反射的方法创建一个Activity;调用Activity的onCreate函数。在onCreate函数中,我们一般会调用setContentView函数。
  3. setContentView即为window设置当前view。这里的window即phoneWindow,用于控制顶层窗口的外观和行为,它的作用是绘制背景和标题栏、默认的按键处理等。它将作为一个顶级的View加入到WindowManager中;View是一个基本的UI单元,占据屏幕的一块矩形区域,可用于绘制,并能处理事件。
  4. ViewRoot是View视图体系的根,每一个Window(注意是Window,比如PhoneWindow)有一个ViewRoot,它的作用是处理layout和View视图体系的绘制工作。视图体系包括Views和ViewGroupViewRoot继承了Handler类,看来它能处理消息。ViewRoot重写了handleMessage函数。
  5. ViewRoot有一个成员变量叫mSurface,它是Surface类型,它和一块RawBuffer有关联。Surface操作这块Raw buffer。
  6. ViewRoot还有W类型的mWindow和一个View类型的mView变量,mWindow将参与binder进行进程间通信,mView指向PhoneWindow的DecorView。
  7. ViewRoot通过mWindow和远端进程SystemServer的WMS有交互,当WMS所在的SystemServer进程接收到按键事件后,会把它交给这个IWindow对象
  8. 整个Activity的绘图流程就是从mSurface中lock一块Canvas,ViewRoot和它所控制的View及其子View公用同一块canvas。Canvas有一个bitmap,那么绘制UI时,数据就画在Canvas的这个bitmap中。
  9. 绘图完成后,客户端经由SharedBufferClient将数据提交到SurfaceFlinger。SurfaceFlinger在收到 VSync 信号时将FrameBuffer中的内容渲染上屏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/741007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 设置信息及插件同步配置

所需插件: 第一步:打开登录界面,进行登录 第二步:再次点击

Go——运算符,变量和常量,基本类型

一.运算符 Go语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 1.1 算术运算符 注意:(自增)和--(自减)在go语言中是单独的语句,并不是运算符。 1.2 关系运算符 1.3 逻辑运算符 1.4 位运算符 位运算符对整数在内存…

【Linux】Linux小结

LVS、Nginx、HAproxy的区别 LVS、Nginx和HAproxy都是常见的负载均衡器,用于将网络负载分散到多个服务器上,以提高系统的可用性和性能 功能不同: LVS是一个Linux内核模块,在网络层(第四层)运行的。 Nginx和…

基于springboot+vue实现药品信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现药品信息管理系统演示 摘要 本文介绍了一种基于SpringBoot的药品信息管理系统的设计与实现。该系统旨在提高药品管理的效率和准确性,包括药品信息的录入、修改、查询和删除、药品入库、出库等功能。该系统采用了SpringBoot框架、MySQL数据库、…

[GPU]2.编译.cu文件

在编译.cu文件的时候,需要先确定自己已经安装了CUDA,并将其配置到系统环境中。 当然这个的前提是——你的显卡得是nvida的,你才能安装这个工具 如果你完成了这些的话,编译.cu文件就比较容易了,比如这个文件&#xff…

金三银四,求职攻略:解锁面试密码,赢在职场起跑线

春风拂面,金三银四的求职季如期而至。 你是否已经准备好在这场求职大战中脱颖而出,斩获心仪的职位?是不是还在为如何准备一份吸引人的简历而犯愁?是不是担心自己在面试中紧张失言,错失良机?是不是对如何了…

从入门到入魔,100个Python实战项目练习(附答案)!

大家好,我是彭涛。 之前给大家整理的资料,都是理论性的,虽然每一个知识点都给出了对应的示例代码,但是好多人还是感觉有一点点杂乱,如果有系统的实战项目练习就好了。 所以,应大家的需求,我们为…

HarmonyOS应用开发-Stage模型开发概述

基本概念 UI框架 HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。提供了应用UI开发所必需的能力:多种组件、布局计算、动画能力、UI交互、绘制。 方舟开发框架针对开发者提供了两种开发范式: 基于ArkTS…

【yolov8和yolov5】用命令快速着手训练

文章目录 1.yolov81.1.创建conda环境1.2.下载代码和环境1.3.YOLOv8训练、自测和预测的代码及解释1.3.1. YOLOv8 训练代码:1.3.2.yolov8 自测代码:1.3.3.yolov8 推理代码:1.3.4.注意: 2.yolov52.1.创建conda环境2.2.下载代码和环境…

简单聊一聊项目中用反射来做过啥【Java基础题】

1.什么是反射机制 反射允许(在运行时动态地)对封装类的字段、方法、构造函数的信息进行编程访问 在我们的代码中,使用构造器直接生成对象、直接访问对象、对象的成员等方式,是清晰直观的。但在有些场景中,需要在运行时动态地操作这些成员&…

Cisco Packet Tracer模拟器实现路由器的路由配置及网络的安全配置

1. 内容 1. 配置路由器实现多个不同网络间的通信,路由器提供的路由协议包括静态路由协议、RIP动态路由、OSPF动态路由协议等等,训练内容包括路由器的静态路由配置、路由器的RIP动态路由配置、路由器的OSPF动态路由配置以及路由器的路由重分布配置。 2.…

LaneNet 论文阅读

论文链接 Towards End-to-End Lane Detection: an Instance Segmentation Approach 0. Abstract 在本文中,将车道检测问题转化为实例分割问题——其中每个车道形成自己的实例——可以进行端到端训练为了在拟合车道之前对分段车道实例进行参数化,应用基…

Seata源码流程图

1.第一阶段分支事务的注册 流程图地址:https://www.processon.com/view/link/6108de4be401fd6714ba761d 2.第一阶段开启全局事务 流程图地址:https://www.processon.com/view/link/6108de13e0b34d3e35b8e4ef 3.第二阶段全局事务的提交 流程图地址…

Kafka生产消费实战-JAVA

Kafka生产消费实战-JAVA 文章目录 Kafka生产消费实战-JAVA生产者代码消费者代码消费者代码扩展Consumer消费offset查询Consumer消费顺序Kafka的三种语义 生产者代码 public static void main(String[] args) {Properties prop new Properties();// 指定broker地址prop.put(&q…

Qt教程 — 1.1 Linux下安装Qt

目录 1 下载Qt 1.1 官方下载 1.2 百度网盘下载 1.3 Linux虚拟机终端下载 2 Qt安装 3 安装相关依赖 4 测试安装 1 下载Qt 1.1 官方下载 通过官网下载对应版本,本文选择的版本为qt-opensource-linux-x64-5.12.12,Qt官方下载链接:htt…

微信小程序(一)

WebView app.是全局配置&#xff0c;app.json是全局配置文件&#xff0c;在页面的.json配置文件中的配置会覆盖我们全局的配置 快捷键&#xff1a; .box 敲回车 ----- <view class"box"></view> .row*8 敲回车&#xff1a; .row{$}*8 敲回车 案例1&…

自然语言处理(NLP)—— 语义关系提取

语义关系是指名词或名词短语之间的联系。这些关系可以是表面形式&#xff08;名词性实体&#xff09;之间的联系&#xff0c;也可以是知识工程中概念之间的联系。在自然语言处理&#xff08;NLP&#xff09;和文本挖掘领域&#xff0c;识别和理解这些语义关系对于信息提取、知识…

力扣每日一题 在受污染的二叉树中查找元素 哈希 DFS 二进制

Problem: 1261. 在受污染的二叉树中查找元素 思路 &#x1f468;‍&#x1f3eb; 灵神题解 &#x1f496; 二进制 时间复杂度&#xff1a;初始化为 O ( 1 ) O(1) O(1)&#xff1b;find 为 O ( m i n ( h , l o g 2 t a r g e t ) O(min(h,log_2target) O(min(h,log2​targ…

数字孪生与智慧城市:实现城市治理现代化的新路径

随着信息技术的迅猛发展&#xff0c;智慧城市已成为城市发展的必然趋势。数字孪生技术作为智慧城市建设的重要支撑&#xff0c;以其独特的优势为城市治理现代化提供了新的路径。本文将探讨数字孪生技术在智慧城市中的应用&#xff0c;以及如何实现城市治理的现代化。 一、数字…

Python 导入Excel三维坐标数据 生成三维曲面地形图(体) 5-3、线条平滑曲面且可通过面观察柱体变化(三)

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…