Android View的绘制流程

news2025/1/16 0:53:22

1.不管是View的添加,还是调用View的刷新方法invalidate()或者requestLayout(),绘制都是从ViewRootImpl的scheduleTraversals()方法开始

void scheduleTraversals() {
        if (!mTraversalScheduled) {
            mTraversalScheduled = true;
            mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
            mChoreographer.postCallback(
                    Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
            ......
        }
    }

首先会发送一个同步屏障消息,以便及时响应UI刷新的异步消息。
然后向Choreographer注册了一个Vsync信号的监听。
2.Vsync信号通过Choreographer回调之后,会执行TraversalRunnable里面的doTraversal()方法

void doTraversal() {
        if (mTraversalScheduled) {
            mTraversalScheduled = false;
            mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);

            performTraversals();
            
        }
    }

doTraversal()方法里首先会移除同步屏障消息,然后执行performTraversals()方法。

performTraversals(){
	performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
	
	performLayout(lp, mWidth, mHeight);

	performDraw(mActiveSurfaceSyncGroup)
}

performTraversals()方法里面就会执行我们熟悉的测量、布局、绘制的方法。

3.当测量和布局执行完成后,会执行performDraw()方法,这里分为了开启硬件加速和不开启硬件加速两种绘制方式。

private boolean performDraw(@Nullable SurfaceSyncGroup surfaceSyncGroup) {
	draw(fullRedrawNeeded, surfaceSyncGroup, mSyncBuffer);
}
private boolean draw(boolean fullRedrawNeeded, @Nullable SurfaceSyncGroup activeSyncGroup,
            boolean syncBuffer) {
	if (isHardwareEnabled()) { //如果开启了硬件加速,使用单独的渲染线程
		mAttachInfo.mThreadedRenderer.draw(mView, mAttachInfo, this);
	} else { //使用CPU调用libSkia库渲染
		drawSoftware(surface, mAttachInfo,xOffset,yOffset,scalingRequired, dirty, surfaceInsets)
	}
	
}

4.开启硬件加速的绘制方式
开启硬件加速,会创建一个RenderThread线程,MainThread会把需要绘制的内容记录到DisplayList里面,并通知RenderThread线程开始渲染,而此时MainThread可以从这个绘制任务中解脱出来。

void draw(View view, AttachInfo attachInfo, DrawCallbacks callbacks) {
	updateRootDisplayList(view, callbacks); //同步View内容到DisplayList
	......
	syncAndDrawFrame(frameInfo); // 通知渲染线程开始工作
}

RenderThread会调用libhwui库去做渲染,使用GPU的硬件资源。
不管是否开启硬件加速,只要是绘制,都会先申请空的图形缓冲(dequenebuffer),然后做内容渲染,然后再把有内容的图形缓冲加入消费队列(quenebuffer)。

5.使用软件方式绘制
软件方式绘制渲染,首先通过调用Surface的lockCanvas方法,申请图形缓冲,并关联到Skia图形库;然后调用view的draw方法绘制,这里会调用到View的ondraw()回调方法;绘制完后,通过unlockCanvasAndPost方法把绘制好的缓冲加入到图形缓冲队列,SurfaceFlinger会消费图形缓冲并合成缓冲帧,通过HWC给到屏幕驱动显示。

private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff,boolean scalingRequired, Rect dirty, Rect surfaceInsets) {
	canvas = mSurface.lockCanvas(dirty);       
	mView.draw(canvas);
	surface.unlockCanvasAndPost(canvas);
}

大概的流程图如下:
在这里插入图片描述

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

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

相关文章

什么牌子的充电宝小巧容量大!盘点小巧性价比高充电宝!

想象一下,当准备轻装出门,无论是逛街购物、户外运动,还是长途旅行,一个小巧玲珑却又容量充足的充电宝,能轻松地被塞进的口袋、背包的小角落里,随时随地为的电子设备“续命”,这是多么令人欣喜的…

Tita的OKR:高端制造行业的OKR案例

高端设备制造行业的发展趋势: 产业规模持续扩大:在高技术制造业方面,航空、航天器及设备制造业、电子工业专用设备制造等保持较快增长。新能源汽车保持产销双增,新材料新产品生产也高速增长。 标志性装备不断突破:例如…

sqlite数据库,轻量级数据库的使用

什么是sqlite数据库 sqlite是具有零配置、无服务的特点,遵循 ACID 规则,是一款备受欢迎的轻量级数据库。 tips:ACID 规则即,A(原子性)、C(一致性)、I(独立性&#xff0…

第一百六十七节 Java IO教程 - Java Zip字节数组

Java IO教程 - Java Zip字节数组 校验和 Java在java.util.zip包中提供了一个Adler32类来计算数据字节的Adler-32校验和。 我们需要调用这个类的update()方法将字节传递给它。 在同一个包中还有另一个名为CRC32的类,它允许您使用CRC32算法计算校验和。 以下代码…

2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中,可以使用不同的数据类型(字符、数字、矩阵、字符串和元胞)合并为字符串,然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码,展示如何将不同数据类型合并为字符串,并以不…

Java的maven项目pom文件因为版本问题导入失败的处理办法

前言 今天遇到的一个问题,而且网上的答案很乱,几乎每人各执一词,年份还差距很远,几乎没有为我解决问题提供什么帮助,感觉蛮怪的,确实不常见,但不应该每次都靠降低版本来解决这种小类小bug&…

【文心智能体】前几天百度热搜有一条非常有趣的话题《00后疯感工牌》,看看如何通过低代码工作流方式实现图片显示

00后疯感工牌体验:https://mbd.baidu.com/ma/s/6yA90qtM 目录 前言比赛推荐工作流创建工作流入口创建工作流界面工作流界面HTTP工具卡点地方 总结推荐文章 前言 前几天百度热搜有一条非常有有趣《00后疯感工牌》。 想着通过文心智能体去一键生成00后疯感工牌是不是…

防火墙的冗余基础知识+实验检测

将之前先理清需要注意的知识点: 1、注意防火墙冗余时的会话表必须保持一致,这里HRP技术已经做到 2、vrrp是自动开启抢占的,且是根据优先级进行抢占的 3、免费ARP的作用:告诉交换机的某个IP的mac地址变成了我的这个mac地址 4、HRP …

Calibration相机内参数标定

1.环境依赖 本算法采用张正友相机标定法进行实现,内部对其进行了封装。 环境依赖为 ubuntu20.04 opencv4.2.0 yaml-cpp yaml-cpp安装方式: (1)git clone https://github.com/jbeder/yaml-cpp.git #将yaml-cpp下载至本地 &a…

Sentinel规则持久化Push模式两种实现方式

文章目录 sentinel持久化push推模式微服务端的实现具体实现源码分析读数据源写数据源的实现 微服务端解析读数据源流程 修改源码的实现官方demo修改源码实现配置类flowauthoritydegreadparamsystemgateway修改源码 测试补充 前置知识 pull模式 sentinel持久化push推模式 pull拉…

效率飙升!用升级版思维导图搞定测试用例

Xmind思维导图<转>测试用例_如何将xmind改成测试用例-CSDN博客https://weiyv.blog.csdn.net/article/details/135920569 上一次的【xmind思维导图转测试用例】的文章浏览量飙升,这一次把工具又进行升级啦,是在线版的免费工具哦&am…

JRebelXRebel在线激活(亲测可用)

包含所有新旧版本,包括2023.4.2、2023.4.1、2023.4.0、2023.3.2、2023.3.1、2023.3.0、2023.2.2、2023.2.1、2023.2.0、2023.1.2、2023.1.1 等以及所有2022版本 JRebel&XRebel激活服务器地址 激活服务器地址(路线1,推荐),可…

文本到 3D AI 生成——Meta 3D Gen、OpenAI Shap-E工作原理与算法解析

概述 根据文本提示生成 3D 数字资产的能力代表了人工智能和计算机图形学领域最近最令人兴奋的发展之一。随着 3D 数字资产市场规模预计将从2024 年的 28.3 亿美元增加到 2029 亿美元,文本转 3D 人工智能模型将在游戏、电影、电子商务等行业的内容创作革命中发挥重要…

【论文阅读】(StemGNN)多元时间序列预测的谱时间图神经网络

(StemGNN)Spectral Temporal Graph Neural Network for Multivariate Time-series Forecasting 引用: Cao D , Wang Y , Duan J ,et al.Spectral Temporal Graph Neural Network for Multivariate Time-series Forecasting[J]. 2021.DOI:10.…

揭秘“循环乐购”:消费赠礼,每日返利

大家好,我是吴军,今天作为您的电商策略顾问,将带您深入探索一种前所未有的商业模式——“循环乐购”。在这个模式中,消费不再是单向支出,而是成为了开启财富增值的钥匙。您是否好奇,为何有人能在享受购物乐…

ESP32部署TensorFlow Lite

本来是想找一篇中文教程,不过只看到一个英文官方的,也行吧,虽然效率会慢丢丢。 GitHub - espressif/esp-tflite-micro: TensorFlow Lite Micro for Espressif Chipsets 看了一圈,有个中文的: esp-dl/README_cn.md a…

C语言之大小端理解

目录 1前言2 大小端理解与区分3 大小端的识别和基本切换操作4 总结 1前言 在汽车CAN通讯报文中往往会接触到Intel类型和motorola类型,实际项目中涉及到多机通讯也会接触到大小端问题 2 大小端理解与区分 大端(Big_Endian) :低字节放在高地址小端(Little_Endian):…

STM32 BootLoader 刷新项目 (三) 程序框架搭建及刷新演示

STM32 Customer BootLoader 刷新项目 (三) 程序框架搭建 文章目录 STM32 Customer BootLoader 刷新项目 (三) 程序框架搭建典型工作流程 1. 硬件原理图介绍1.1 USART硬件介绍1.2 LED和按键介绍 2. STM32 CubeMX工程搭建2.1 创建工程2.2 系统配置2.3 USART串口配置2.4 配置按键G…

SSE(Server Sent Event)实战(2)- Spring MVC 实现

一、服务端实现 使用 RestController 注解创建一个控制器类(Controller) 创建一个方法来创建一个客户端连接,它返回一个 SseEmitter,处理 GET 请求并产生(produces)文本/事件流 (text/event-stream) 创建…

QT小细节

QT小细节 1 QTextToSpeech1.1 cmake1.2 qmake QT6 6.7.2 1 QTextToSpeech 从下图可以看到,分别使用qmake或者cmake编译情况下的,QTextToSpeech的使用方法 QTextToSpeech官方链接,也可以直接在QT Creator的帮助中搜索 1.1 cmake 将上图中的…