android 绘制过程摘要

2023-05-16

1、没有硬件加速的UI绘制过程:在Android应用程序进程这一侧,每一个窗口都关联有一个Surface。每当窗口需要绘制UI时,就会调用其关联的Surface的成员函数lock获得一个Canvas,其本质上是向SurfaceFlinger服务Dequeue一个Graphic Buffer。Canvas封装了由Skia提供的2D UI绘制接口,并且都是在前面获得的Graphic Buffer上面进行绘制的。绘制完成之后,Android应用程序进程再调用前面获得的Canvas的成员函数unlockAndPost请求显示在屏幕中,其本质上是向SurfaceFlinger服务Queue一个Graphic Buffer,以便SurfaceFlinger服务可以对Graphic Buffer的内容进行合成,以及显示到屏幕上去。

2、有硬件加速的UI绘制过程:硬件加速渲染和软件渲染一样,在开始渲染之前,都是要先向SurfaceFlinger服务Dequeue一个Graphic Buffer。不过对硬件加速渲染来说,这个Graphic Buffer会被封装成一个ANativeWindow,并且传递给Open GL进行硬件加速渲染环境初始化。在Android系统中,ANativeWindow和Surface可以是认为等价的,只不过是ANativeWindow常用于Native层中,而Surface常用于Java层中。另外,我们还可以将ANativeWindow和Surface看作是像Skia和Open GL这样图形渲染库与操作系统底层的图形系统建立连接的一个桥梁。

       Open GL获得了一个ANativeWindow,并且进行了硬件加速渲染环境初始化工作之后,Android应用程序就可以调用Open GL提供的API进行UI绘制了,绘制出来内容就保存在前面获得的Graphic Buffer中。当绘制完毕,Android应用程序再调用libegl库提供的一个eglSwapBuffer接口请求将绘制好的UI显示到屏幕中,其本质上与软件渲染过程是一样的,都是向SurfaceFlinger服务Queue一个Graphic Buffer,以便SurfaceFlinger服务可以对Graphic Buffer的内容进行合成,以及显示到屏幕上去。

3、绘制提速办法:在Android应用程序窗口中,每一个View都抽象为一个Render Node,而且如果一个View设置有Background,这个Background也被抽象为一个Render Node。这是由于在OpenGLRenderer库中,并没有View的概念,所有的一切可绘制的元素都抽象为一个Render Node。

       每一个Render Node都关联有一个Display List Renderer。这里又涉及到另外一个概念——Display List。注意,这个Display List不是Open GL里面的Display List,不过它们在概念上是差不多的。Display List是一个绘制命令缓冲区。也就是说,当View的成员函数onDraw被调用时,我们调用通过参数传递进来的Canvas的drawXXX成员函数绘制图形时,我们实际上只是将对应的绘制命令以及参数保存在一个Display List中。接下来再通过Display List Renderer执行这个Display List的命令,这个过程称为Display List Replay。

       引进Display List的概念有什么好处呢?主要是两个好处。第一个好处是在下一帧绘制中,如果一个View的内容不需要更新,那么就不用重建它的Display List,也就是不需要调用它的onDraw成员函数。第二个好处是在下一帧中,如果一个View仅仅是一些简单的属性发生变化,例如位置和Alpha值发生变化,那么也无需要重建它的Display List,只需要在上一次建立的Display List中修改一下对应的属性就可以了,这也意味着不需要调用它的onDraw成员函数。这两个好处使用在绘制应用程序窗口的一帧时,省去很多应用程序代码的执行,也就是大大地节省了CPU的执行时间。

4、线程:在Android 5.0之前,Android应用程序的Main Thread不仅负责渲染UI,还负责处理用户输入。通过引进Render Thread,我们就可以将UI渲染工作从Main Thread释放出来,交由Render Thread来处理,从而也使得Main Thread可以更专注高效地处理用户输入,这样使得在提高UI绘制效率的同时,也使得UI具有更高的响应性。

5、OPENGL 绘制环境初始化:Open GL环境也称为Open GL渲染上下文。一个Open GL渲染上下文只能与一个线程关联。在一个Open GL渲染上下文创建的Open GL对象一般来说只能在关联的Open GL线程中操作。这样就可以避免发生多线程并发访问发生的冲突问题。这与大多数的UI架构限制UI操作只能发生在UI线程的原理是差不多的。Render Thread有一个Task Queue,Main Thread通过一个代理对象Render Proxy向这个Task Queue发送一个drawFrame命令,从而驱使Render Thread执行一次渲染操作。因此,Android应用程序UI硬件加速渲染环境的初始化过程任务之一就是要创建一个Render Thread。 一个Android应用程序可能存在多个Activity组件。在Android系统中,每一个Activity组件都是一个独立渲染的窗口。由于一个Android应用程序只有一个Render Thread,因此当Main Thread向Render Thread发出渲染命令时,Render Thread要知道当前要渲染的窗口是什么。从这个角度看,Android应用程序UI硬件加速渲染环境的初始化过程任务之二就是要告诉Render Thread当前要渲染的窗口是什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 绘制过程摘要 的相关文章

  • STM32学习心得(第一天)

    作为一名刚接触STM32的初学者 xff0c 今天通过观看网站上的视频 xff0c 对STM32有了最基础的了解 xff0c 并学到了一些STM32的学习方法 xff0c 自我感觉收获不错 一 学习方法 1 两个学习网址 xff1a 开源电
  • STM32学习心得(第二天)

    我感觉今天的学习状态还是可以的 xff0c 进行了开发环境的搭载和怎样构建一个新项目 基于固件库 xff0c 学到了较多的新知识 xff0c 同时了解了STM32的启动模式 xff0c 程序下载的两种方法 xff08 1 ISP串口下载2
  • STM32学习心得(第三天)

    今天的状态还可以 xff0c 学习了新建工程模板 xff08 基于寄存器 xff09 和了解了GPIO工作原理 xff0c 昨天基于库函数新建工程模板学习的并不牢固 xff0c 今天还是无法自己创建出来 xff0c 正好借此机会再巩固一下
  • Ubuntu 快速更换阿里源

    简介 xff1a 本文主要给大家讲解如何为Ubuntu更换阿里源 xff0c 通过以下四个步骤即可快速实现换源 镜像下载 域名解析 时间同步请点击 阿里巴巴开源镜像站 一 查看ubuntu的Codename lsb release a gr
  • 【工作遇到的问题——已解决】pip3 install numpy失败

    问题描述 需求 xff1a 求出列表中90 的响应时间 xff1a import numpy as np span class token keyword for span i in finalvalues span class token
  • 7、CAS

    目录 1 CAS是什么 1 1 CAS基本知识 1 2 CAS基本思想 2 对原子类中使用的CAS进行分析 2 1 CAS demo 代码 2 2 源码分析 3 原子类 3 1 有那些属性 用AtomicInteger分析 3 2 Unsa
  • ubuntu设置网络代理在内网中使用 apt代理、docker代理

    ubuntu设置apt 代理 编辑apt 配置文件 span class token function sudo span span class token function vim span etc apt apt conf 添加以下内容
  • 通过VNC远程连接ubuntu桌面(多种客户端连接方式)

    背景 有些时候一些设备不带显示器和键盘鼠标 xff0c 我们来维护他 xff0c 是通过ssh远程连接进行操作 但可能有些维护需要有图形显示来操作 xff0c 这时候再用ssh就不是很合适了 我所遇的设备情况是 xff0c 经常要自己接入显
  • 选择悖论:开源网络操作系统(NOS)重启指南

    我们拥有的选择越多 xff0c 就越不满足 然而 xff0c 只有手握选择权 xff0c 才能在决策之时享受自由和自主 这就是众所周知的选择悖论 当你打算从亨氏旗下的57种薯片 xff08 我的美国朋友们把它叫做chips xff09 中挑
  • Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

    一 摘要 自下而上的机制 基于 Faster R CNN xff1a 提取出图像区域 xff0c 每个区域都有一个相关的特征向量 自上而下的机制 xff1a 确定特征权重 提出了一种自下而上和自上而下的结合注意力机制 xff0c 使注意力能
  • 在keras环境下将numpy数据形式转换为tensor

    目录 前期尝试试错最终的解决方法 前期尝试 因为刚刚开始学习 xff0c 想要记录一下自己学习的全过程 xff0c 所以想知道具体方法的可以直接在目录跳到最后 xff1a 最终的解决方法 最近开始接触神经网络的学习 xff0c 在看过一个比
  • SSH测试远程服务器端口的连通性

    ssh是linux的标准配置并且最常用 xff0c 可以用来判断端口是否打开 用法 ssh v p port username 64 ip v 详细模式 会打印日志 xff0c 显示登录的细节 p 指定端口 username 可以随意 ip
  • hadoop单表关联

    1 单表关联 实例描述 实例中给出child parent xff08 孩子 父母 xff09 表 xff0c 要求输出grandchild grandparent xff08 孙子 爷奶 xff09 表 样例输入 如下所示 file xf
  • 调试带有源码的dll

    环境 windows 7 Visual Studio 2010 将dll项目debug目录下的 dll lib pdb文件拷贝到exe项目程序的debug目录下 xff08 是exe所在的文件夹 xff09 在调用dll里面的函数前面增加断
  • 遍地开花的 Attention ,你真的懂吗?

    阿里妹导读 xff1a 曾被 paper 中各种各样的 Attentioin 搞得晕晕乎乎 xff0c 尽管零零散散地整理过一些关于Attention 的笔记 xff0c 重点和线索依然比较凌乱 今天 xff0c 阿里巴巴工程师楠易 xff
  • Javaweb期末复习大纲

    20 21 2022 学年第 1 学期考试复习纲要 题型 xff1a 一 单项选择题 二 多选题 三 判断题 四 填空题 五 简答题 六 补充程序 重点复习章节及知识点 xff1a 第3章重点记忆归纳 xff1a xff08 题目分布 xf
  • Python 装饰器的三种用法及使用示例

    文章目录 前言装饰器三种用法包括 xff1a 不带参数的装饰器 带参数的装饰器 创建装饰器类 总结 前言 装饰器的作用主要是在不影响函数逻辑的情况下 xff0c 扩展其某个常用功能 xff0c 常用于为函数添加事件记录 例如当需要给创建的所
  • pip3在Ubuntu下的安装、升级、卸载

    参考资料 pip 常用命令 pip 官方文档 一 常用命令 1 在线安装 gt gt sudo apt get install python3 pip 1 1 离线安装 下载get pip py脚本 wget https bootstrap
  • 光立方原理图理解

    原文链接 xff08 点击原文链接获取更多学习干货 xff09 xff1a http blog bools cn archives 850 光立方原理图理解 一 淘宝提供的原理图版本1版本2我AD画的原理图一点点小技巧 xff1a 我不知道
  • 三种常用的LED驱动电源电路图详解

    时间 xff1a 2017 07 10 15 30 43 关键字 xff1a LED电路 led驱动电源 led电源电路图 LED电源有很多种类 xff0c 各类电源的质量 价格差异非常大 xff0c 这也是影响产品质量及价格的重要因素之一

随机推荐

  • haar+adaboost结合讲解(偏重实际)

    这是一篇之前总结的文档 xff0c 大部分来源于csdn和文献 xff0c 如有未标明引用 xff0c 请联系我加上 目录 1 Haar特征和积分图 1 1 Haar特征的生成 1 2 计算Haar特征值 1 3 Haar特征值归一化 1
  • 【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程

    ROS安装指南 目录 ROS安装指南 前言 一 配置Linux清华镜像源1 1 介绍1 2 开始配置 二 安装ROS2 1 ROS的介绍2 1 开始安装 xff1a 配置公钥2 2 系统更新2 3 安装ROS 三 配置ROS3 1 初始化r
  • Python2.7安装教程

    Python安装教程 1 下载安装包 链接 xff1a https www python org downloads release python 2712 根据自己的系统选择对应的版本 注意 必须在全英文路径下安装 2 双击下载的安装程序
  • CMake+QT使用教程

    一 CMake入门 下面是使用 Qt 用 C 43 43 编写的控制台应用程序的典型文件 xff1a CMakeLists txt 1 构建一个控制台应用程序 span class token comment 指定应用程序所需的CMake最
  • Ubuntu18.04修改file descriptors(文件描述符限制),解决elasticsearch启动报错问题

    最近在学习elasticsearch xff0c 使用的平台是Ubuntu18 04 xff0c 在部署过程中的坑记录一下 下载安装的过程就不说了 xff0c 在启动es的时候报错 max file descriptors 65535 fo
  • 场景文本识别应用自然语言处理的方法综述(2021年)

    诸神缄默不语 个人CSDN博文目录 本文是场景文本识别领域应用自然语言处理方法的前沿技术综述 改自作者2021年末交的工程前沿技术讲座课程大作业 xff08 另一门课程计算机视觉的大作业也是在此文基础上改进的 xff09 xff08 看作者
  • linux下安装node和npm

    linux下安装node和npm 1 打开linux的命令窗口 xff0c 进入根目录 cd 2 使用wget命令下载node包 注 xff1a 这里作者下载的是16 14版本的node xff0c 如果有需要可以直接更换制定版本的node
  • Xcode 升级后,常常遇到的遇到的错误解决方法

    1 xff0c 错误信息 xff1a 34 OBJC CLASS xxxxx 34 referenced from objc class ref in ViewController o ld symbol s not found for a
  • OpenCore介绍

    一 OpenCore简介 OpenCore是Android的多媒体核心 xff0c 采用C 43 43 实现 xff0c 定义了全功能的操作系统移植层 xff08 OSCL xff09 xff0c 各种基本的功能均被封装成类的形式 xff0
  • 《C++0x漫谈》系列之:Concept, Concept!

    C 43 43 0x 漫谈 系列之 xff1a Concept Concept By 刘未鹏 pongba C 43 43 的罗浮宫 http blog csdn net pongba C 43 43 0x 漫谈 系列导言 这个系列 其实早
  • 【Ubuntu】通过换源解决Ubuntu软件安装的问题(注意Codename的变化)

    通过换源解决Ubuntu软件安装的问题 前言一 查看Ubuntu系统版本号 xff08 官方语言系统代码 xff09 二 给apt install换源1 备份sources list2 编辑sources list3 apt get 检查更
  • conda install遇到condahttperror问题——代理

    如上图 xff0c 无论wget 还是conda install均出现以上提示 xff0c 换了各种conda源也无法解决 其中注意10 19 110 31 xff0c 发现是代理问题 查看proxy xff1a env grep i pr
  • 维普下载论文

    前几天还在感叹没有网站提供论文评论 现在发现维普已经提供论文评论 并且评论的东西都可以积分 积分之后可以下载论文 推荐论文让别人点击也可以增加积分 是个不错的计划
  • CentOS7 关闭防火墙

    CentOS6关闭防火墙使用以下命令 xff0c span class hljs comment 临时关闭 span service iptables stop span class hljs comment 禁止开机启动 span chk
  • 告别我的2016

    又过了一年 xff01 xff01 xff01 每一年都会因为所经历的不同 xff0c 收获也不同 在过去的2016年 xff0c 回想自己在工作上好像没有做多少事情 xff0c 却也有不一样的收获 2016年2月份 xff0c 刚过来春节
  • 判断某个月份是否在给定的月份区间内

    判断某个月份是否在给定的月份区间内 输入 指定月份 xff1a m m m 月份区间 xff1a m 1 m 1
  • 数据清洗

    1 概念 数据清洗 xff1a 把脏数据清洗掉 xff0c 提高数据质量 Data cleansing Data cleaning Data scrubbing三种表达方式都可以 xff0c 意思都是检测和去除数据集中的噪声数据和无关数据
  • 联想H61主板升级BIOS,支持nvme硬盘

    本教程升级有一定风险 xff1a 请阅读文章最后的 遗憾 部分接受再升级 最近因为手上有一台联想的i7 2600主机 xff0c 他的主板是H61的 xff0c 正好看见pcie接口空着 xff0c 在网上看见有人用它升级了拜滕的存储芯片
  • armv8 摘要

    作者 xff1a 蜗蜗 发布于 xff1a 2015 7 7 22 31 分类 xff1a ARMv8A Arch 1 前言 ARMv8 xff08 当前只有A系列 xff0c 即ARMv8 A xff09 架构 xff0c 是ARM公司为
  • android 绘制过程摘要

    1 没有硬件加速的UI绘制过程 xff1a 在Android应用程序进程这一侧 xff0c 每一个窗口都关联有一个Surface 每当窗口需要绘制UI时 xff0c 就会调用其关联的Surface的成员函数lock获得一个Canvas xf