Pag渲染过程 -- 背景知识

news2024/11/18 13:40:19

什么是渲染

渲染是图形程序的核心,无论是我们在电子设备上看到的任何图形或者文字都是利用计算机图形渲染技术给我们呈现出来的结果。在计算机里一开始是直接利用CPU往显示器的FrameBuffer内写入数据即可把图形展示到显示器上,但是随着用户的需求和技术的发展,人们发明了一种专门用于计算数字图形渲染的硬件 — GPU。
CPU vs GPU

  • 黄色代表控制器(Control):用于协调控制整个CPU的运行,包括取指令等操作。
  • 绿色的ALU(Arithmetic Logic Unit):算数逻辑单元,主要用于进行数学,逻辑计算。
  • 橙色的Cache和DRAM分别为缓存和RAM,用于存储信息。

图中可以看到GPU的ALU很多,而CPU的ALU很少。所以GPU主要就用来做并行计算,图像计算正好就很符合这个场景。有人做过一个形象的比喻:

CPU就像是几个数学家,能够进行很多高难度的计算和多功能复杂的控制;而GPU就像是成千上万个小学生,基本只会做计算,但是其他方面的能力很弱。图形处理和渲染是简单的计算密集的工作,所以交给一大堆小学生去做比几个数学家做会快很多。

只需要利用图形API把指令发送给GPU驱动程序即可在短时间内实现极高复杂度的图形渲染结果。目前用得最广泛的API是OpenGL,其兼容性也是最好的。不过也有功能更强大,更高效的API,比如DirectX(Windows),Melta(MacOS/IOS),Vulkan(跨平台)等API供我们选择。

硬件渲染引擎的基本流程

GPU是需要通过CPU来驱动执行的,也就是说图像数据的组织和计算过程其实全都是在我们主控制程序里面需要保存的。所以一个基本的硬件渲染管线大致如下:
Render pipeline

Application:

  1. 创建渲染循环
  2. 组织GPU渲染的指令和数据
  3. 把渲染指令和数据输入到GPU内进行渲染

GPU Pipeline:

  1. 先对传入的顶点进行几何操作
  2. 对屏幕内的顶点进行光栅化转为像素
  3. 逐个处理像素颜色
  4. 结束渲染,继续下一次渲染

在这个渲染流程里面Application部分都是在CPU内执行的,里面调用的绝大部分渲染相关的函数也都只是先放入到Buffer内,并不会真正的去执行,只有在flush之后才会让GPU去执行这些指令。如果看过Android应用渲染的同学应该知道一个叫做DisplayListDraw OP的概念,每一个View在硬件加速开启的情况下都会生成一个DisplayList,这个DisplayList内就是一堆DrawOp的组合,这些DrawOp其实就是GPU渲染的指令了。然后通过有序的组织,每一个View在invalidate的时候只会重建自身的DisplayList或者某个DrawOP的属性,实现高效的渲染流程。
在提交任务给GPU之后,其实CPU的资源也就被释放出来了,不用一直等待GPU执行结束,这个时候我们完全可以准备下一次渲染所需的GPU Operation,这样就可以最大限度的提升渲染的流畅度。Android在5.x时代就加入了RenderThread的线程去专门执行OpenGL指令,在4.x时代的OpenGL指令都是在主线程执行的。

我这里只是粗略的提了下渲染的概念,其实【渲染/计算机图形学】是相当大的一个技术方向,涉及到很多计算机科学、线性代数、微积分、几何学、物理学、数字信号处理等知识。对于平面渲染还只是2D渲染,相对简单。在游戏或建模领域需要很深的数学和物理学功底才能深入。零基础的同学可以看看 LearnOpengl入门部分先了解一下图形编程。

什么是比较好的UI渲染系统

衡量UI渲染系统最重要的一点就是流畅度。这个是直接和用户的体验正相关的,很多人并不懂技术,但是就觉得iOS比Android好用很多时候就是因为iOS的UI比Android的UI在体验上更流畅得来的结论。

流畅度

流畅度的核心是帧率(fps):每一秒人们所看到的画面数。一般来说,对于电影或者录像来说,24fps我们就会觉得画面是流畅的,但是对于一套UI渲染系统来说,帧率需要达到60fps。原因是电影或者录像的每一帧其实是带有运动模糊的,所以能够欺骗人眼觉得画面的连续性更好。但是对于渲染出的画面是绝对高清,没有运动模糊,也就必须达到60fps才能够拥有流畅的用户体验。这里可以看这个视频了解更多:why 60fps。要实现60fps,我们每一秒的渲染时间必须控制在16.6ms以内,才能够让用户看起来画面是连续的。这个对系统的设计和硬件的性能是很大的挑战。工程师们在各个系统在实现UI模块的时候,可谓是费尽心思、尽其所能。比如Android的黄油计划,在渲染底层引入了vsync和3 buffer等技术。此外由于渲染计算本身是比较耗时的,但是如果用提前计算好的结果用于合成则会比较高效,所以一般在在应用内部的渲染系统会做分层和分块处理:纵向分层+横向分块。

  • 所谓纵向分层,就是在Z轴方向上按层来划分UI,这样带来的好处在渲染UI的每一帧时,不必每一层都进行重绘。这种分层渲染策略使用到了一种称为“绘制-合成”的UI渲染技术。也就是各层负责绘制好自己的UI,然后再由一个单独的模块对它们进行合成。这样在渲染UI的每一个帧时,只有UI发生了变化的层才需要重新进行绘制,没有发生UI变化的层只需要参与合成这一步即可。
  • 所谓横向分块,就是对于UI的每一个层,按照一定的规则对其进行分块,这样带来的好处就是在渲染UI的每一帧遇到一个需要进行重新绘制的层时,不必对该层的所有内容都进行重新绘制,只需要绘制那些在可视区间的块即可。这样也可以在某种程度上减少渲染操作,从而获得更流畅的UI体验。

比如下面这个页面结构,由两层组成,每一层内部又由多个块组成。如果一层内任意一个元素发生变化,只需要重新绘制发生变化的部分即可,不需要整个画面全都重新绘制,从而实现高效的绘制:
Render sample

我们这里用Android支持硬件加速的的视图系统举个例:

  • 每一个View都被抽象为一个RenderNode
  • 所有的View被组合成为一个整体的DisplayList交给RenderThread渲染。
  • 当视图需要改变的时候只需要更变View的RenderNode即可。
    在这里插入图片描述

这种树形结构的ViewGroup层级我们就可以理解为纵向,而每一层的需要渲染的View就是每一层的Block了。

总结

上面的渲染技术属于比较通用的技术,无论什么系统,只要涉及到UI,或多或少都能看到这些技术的影子。好好的掌握了渲染技术,以后无论遇到什么问题或者学习什么新的系统都能够应对自如。千万不要把自己局限到某一个狭窄的框架内,先了解好通用技术,再去深入到具体技术对于自己的成长是最大的。

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

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

相关文章

别担心,ChatGPT还抢不动你的饭碗

前言: “你是谁?” “我是一个由OpenAI训练的大型语言模型。我旨在帮助人们解答问题和提供信息。由于我是一个计算机程序,所以不会感知或者思考,只能通过已有的数据来回答问题。如果您有任何问题,请随时告诉我。” ---…

rabbitmq部署安装(mac)

安装: // 默认已经下载了homebrew,更新brew资源 brew update // 执行安装 brew install rabbitmq 配置: // 切换到MQ目录,注意你的安装版本可能不是3.9.5(我的版本,当前最新版 cd /usr/local/Cellar/rabbitmq/3.…

如果不是互联网人,谁会找到这些神器?

一、上线啦 你肯定该问了,这个是什么鬼东西。它本来是一个创建自己网站的网站。 现在使用它可以创建自己的小程序,又不是有点小厉害了。 而且功能强大,还支持微信支付,分销,优惠券,营销等多种功能。 还有多…

DS期末复习卷(九)

一、选择题(30分) 1&#xff0e;下列程序段的时间复杂度为&#xff08;A &#xff09;。 for(i0&#xff1b; i<m&#xff1b; i) for(j0&#xff1b; j<t&#xff1b; j) c[i][j]0&#xff1b; for(i0&#xff1b; i<m&#xff1b; i) for(j0&#xff1b; j<t&am…

LeetCode:二叉树的最大深度104;559. N 叉树的最大深度

104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3/ \9 20/ \15 7 返回它的…

看似平平无奇的00后,居然一跃上岸字节,表示真的卷不过......

又到了一年一度的求职旺季金&#xff01;三&#xff01;银&#xff01;四&#xff01;在找工作的时候都必须要经历面试这个环节。在这里我想分享一下自己上岸字节的面试经验&#xff0c;过程还挺曲折的&#xff0c;但是还好成功上岸了。大家可以参考一下&#xff01; 0821测评 …

变则通--通则达--MindSpore社区活动-深度学习模型之数据变换-Transforms学习与体验记录

文章目录已加入 昇思MindSpore社区 证明截图安装 MindSpore 2.0 alpha 步骤打开powershell 或 cmd安装成功的截图实现 数据变换Transforms 任务Common Transforms 通用数据变换Vision Transforms 针对图像数据的变换Text Transforms 文本数据的变换Lambda Transforms结语已加入…

Netty——序列化的作用及自定义协议

序列化的作用及自定义协议序列化的重要性大小对比效率对比自定义协议序列化数据结构自定义编码器自定义解码器安全性验证NettyClientNettyServerNettyClientTestHandlerNettyServerTestHandler结果上一章已经说了怎么解决沾包和拆包的问题&#xff0c;但是这样离一个成熟的通信…

【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

MyBatis快速开发

查询user表中的所有数据 步骤&#xff1a; 创建user表 打开Navicat&#xff0c;新建查询&#xff0c;将下面SQL代码复制粘贴并执行&#xff1a; create database mybatis; use mybatis;drop table if exists tb_user;create table tb_user(id int primary key auto_incremen…

抽象类与接口的区别

抽象类什么是抽象类&#xff1f;抽象类是特殊的类&#xff0c;只是不能被实例化&#xff1b;除此以外&#xff0c;具有类的其他特性&#xff1b;重要的是抽象类可以包括抽象方法&#xff0c;这是普通类所不能的。抽象方法只能声明于抽象类中&#xff0c;且不包含任何实现&#…

Docker安装YApi

目录0、Docker 环境准备1、数据库准备 MongoDB2、启动 YAPI3、官网教程0、Docker 环境准备 Docker 容器之间网络互通需要使用 docker network create yapi 创建一个自定义网络 docker network create yapi1、数据库准备 MongoDB YAPI 的数据库是 MongoDB&#xff0c;准备镜像…

Java线程池使用与原理解析1(线程池优点、使用方法、参数含义及线程池运转机制)

为什么要使用线程池&#xff1f; JDK1.5后JUC包添加了线程池相关接口&#xff0c;在Java诞生之初并没有线程池这个概念。刚开始Java程序都是自行创建线程去处理任务。随着应用使用的线程越来越多&#xff0c;JDK开发者们发现有必要使用一个统一的类来管理这些线程&#xff0c;…

从应届毕业生到大型开源社区 Committer,我做对了什么?

熟悉李成龙的人都叫他小龙。“小龙&#xff0c;2.2.3 Milvus 版本&#xff0c;日志会一直积累在磁盘上吗&#xff1f;默认会定期清除吗&#xff1f;”“小龙&#xff0c;请教一个问题&#xff0c;为啥取不到 field 中的 type 字段&#xff1f;”“小龙……”熟悉 Milvus 社区群…

django项目中如何添加自定义的django command

项目目录 1.我们自己建立的application叫做app&#xff0c;首先在这个app目录下&#xff0c;我们需要新建management目录&#xff0c;这个目录里应该包括&#xff1a;__ init__.py&#xff08;内容为空&#xff0c;用于打包&#xff09;和commands目录&#xff0c;然后在comma…

Linux中使用Docker部署Mysql数据库

前言 和朋友一起搞一个项目&#xff0c;分了一下工作&#xff0c;但是mysql迟迟安装不上&#xff0c;程序都在一个环境里确实容易出现很多问题&#xff0c;浪费时间和经历在这些配置上&#xff0c;好在有docker了&#xff0c;就在docker里搭建一个Mysql数据库使用吧&#xff0…

【计算机网络】计算机网络

目录一、概述计算机网络体系结构二、应用层DNS应用文件传输应用DHCP 应用电子邮件应用Web应用当访问一个网页的时候&#xff0c;都会发生什么三、传输层UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 流量控制TCP 拥塞控制三、网络层IP 数据报格式…

李宏毅《机器学习》Bert笔记

李宏毅《机器学习》Bert笔记和工作原理解释1.参考2. self-supervised learning--bert3. bert的一些用法3.1情感分析3.2词性标注3.3常识推理和NLI3.4 QA问题4.bert的工作原理解释1.参考 bert论文 李宏毅《机器学习》自监督训练-bert 2. self-supervised learning–bert Bert模…

图解JVM

1.JVM的一些概念 ​ JVM:Java虚拟机,可以存储代码以及在运行是可以动态调用一些指令的项目集。 ​ JDK:Java运行时所依赖的环境,[jar包、类]。 ​ JVM的作用:负责将.class文件解释成机器能够识别的机器码。 ​ JVM的位置:在操作系统之上,介于应用与系统之间。 ​ 机器码…

python自动化测试学习路线(从入门到精通)

目录&#xff1a;导读 一、Python的应用场景 二、自动化测试的那些事 三、主流自动化测试框架 三、Python自动化测试学习路线 写在最后 一、Python的应用场景 Python用于简单脚本编程&#xff0c;如编写2048小游戏或12306的自动抢票软件&#xff1b; Python用于系统编程&…