从GPU到屏幕渲染

news2024/11/18 1:32:34

一、Graphics Processing Unit

GPU为图形处理单元;
一般将GPU与CPU放在一起对比:
CPU的强项是做逻辑运算,GPU的强项是做数学运算和图形渲染;
双方都是运算处理器,从结构上来讲都包含运算单元ALU、控制单元Control和缓存单元Cache;
GPU与CPU的结构
所以结果上CPU的运算能力更加均衡,但是不适合做大量的运算;GPU更适合做大量运算;
CPU基本上是实时响应,采用多级缓存来保障多个任务的响应速度;
GPU往往采用的是批处理的机制,即:任务先排好队,挨个处理。

二、图元到位图

输入图元

该阶段由CPU负责,应用可能对图像进行一系列操作,最终形成新的图像信息传给下一阶段;
该图像信息叫做图元(primitives),通常为三角形、线段、顶点。

处理图元

该阶段包括之后由GPU负责,对得到的图元进行处理,GPU流水线(或称渲染管线);
顶点数据;
顶点着色器:将图元中的顶点信息进行视角转换、添加光照信息、增加纹理等操作;
形状(图元)装配:三角形、线段、点分别对应三个、两个、一个Vertex,会将Vertex连接成对应的形状;
几何着色器:添加额外的Vertex,基于三角形、线段和点构建更复杂的几何图形;
光栅化:将几何渲染后的图元信息转换为一系列的图像(图元转换为像素)。

处理像素得到位图

片段着色器(Fragment Shader):Pixel Shader,给予每个像素Pixel正确的颜色,颜色来源于之前得到的顶点、纹理、光照等信息;
测试与混合:(模版测试Mask、深度测试),通过测试后Merging,处理片段前后位置以及透明度。

屏幕成像

GPU渲染结束之后的像素信息,被存储在帧缓冲器(Framebuffer)中,之后视频控制器(Video Controller)会读取帧缓冲器中的信息;
经过数模转换传递给显示器(Monitor),进行显示;
CPU+GPU的渲染流程是一个耗时的过程,如果在电子束扫描新的一帧时,位图还未渲染好,而是在扫描到屏幕中间时才渲染完成,被放入帧缓冲器中,会造成屏幕撕裂
提高显示效率的策略是使用垂直同步信号Vsync与双缓冲机制Double Buffering,垂直同步信号相当于给帧缓冲器加锁:
当电子束完成一帧的扫描,将要从头开始扫描时,就会发出一个垂直同步信号。只有当视频控制器收到后,才会将帧缓冲器中的位图更新为下一帧,这样就能保证每次显示的都是同一帧画面,避免了屏幕撕裂;
双缓冲机制会增加一个备用缓冲器(back buffer),渲染结果会预先保存在备用缓冲器中,在接收到Vsync信号时,视频控制器会将备用缓冲器的内容置换到帧缓冲器中,保证置换操作在一瞬间完成(实际上是交换了内存地址);
启用Vsync+Double Buffering会导致掉帧问题:
如果在接收到Vsync是CPU+GPU还未渲染好新的位图,视频控制器就不会替换帧缓冲器中的位图;
Triple Buffering:在掉帧的时候,CPU和GPU有一段时间处于闲置状态,增加一个缓冲器,就能合理利用进行下一步的渲染,并将渲染结果暂存在新增的帧缓冲器中。

离屏渲染

普通渲染流程是App通过CPU+GPU不停将内容渲染完成放入帧缓冲器(Framebuffer)中,屏幕不断从帧缓冲器中获取内容并实时显示;
离屏渲染是需要额外创建离屏渲染缓冲区(Offscreen Buffer),将提前渲染好的内容放入其中,等到合适的时机再将其中的内容进一步叠加、渲染,完成后将结果切换到帧缓冲器中;
相对而言创建离屏缓冲需要额外的内存消耗,但是若需要显示的是一个频次很高的位图相对而言就会节省之前的计算过程,所以在实际开发中可以按条件控制。

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

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

相关文章

【笔记】Spring的事务是如何回滚的/Spring的事务管理是如何实现的

Spring的事务是如何回滚的/Spring的事务管理是如何实现的 数据库(Spring事务) 1、建立连接、开启事务(准备工作) 2、进行sql操作(业务逻辑) 3、执行成功,则commit; 执行失败&#x…

【LLM】Qwen学习

安装依赖 pip install transformers4.32.0 pip install accelerate pip install tiktoken pip install einops pip install transformers_stream_generator0.0.4 pip install scipy pip install auto-gptq optimum使用 参见官方介绍 模型 模型结构 QwenBlock 打印模型 ##…

sparkstreamnig实时处理入门

1.2 SparkStreaming实时处理入门 1.2.1 工程创建 导入maven依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.12</artifactId><version>3.1.2</version> </dependency> <dependency…

K8S的二进制部署

K8S的源码包部署 搭建准备&#xff1a; k8smaster01&#xff1a;20.0.0.32 kube-apiserver kube-controller-manager kube-scheduler etcdk8smaster02&#xff1a;20.0.0.33 kube-apiserver kube-controller-manager kube-scheduler node节点01&#xff1a;20.0.0.34 …

Jenkins集成allure测试报告

前言 Allure框架是一个功能强大的自动化测试报告工具&#xff0c;不仅支持多种编程语言&#xff0c;而且能够完美的与各种集成工具结合&#xff0c;包括Jenkins&#xff0c;TeamCity&#xff0c;Bamboo&#xff0c;Maven等等&#xff0c;因此受到了很多测试人员的青睐&#xff…

Redis7快速入门

Docker安装Redis 指定密码&#xff1a; docker run --restartalways -p 6379:6379 --name redis -d redis:7.0.12 --requirepass zhangdapeng520不指定密码&#xff1a; docker run --restartalways -p 6379:6379 --name redis -d redis:7.0.12在真实的开发中&#xff0c;如…

【c++】入门1

c关键字 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染&#xff…

C/C++图形化编程(1)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 信念是一把无坚不摧的利刃&#xff01…

每日一题-----逆序字符串

大家好我是Beilef&#xff0c;在一个美好的下午我意外接触到编程并且产生了兴趣&#xff0c;哈哈我要努力成为一个跨界者&#xff0c;让我们一起加油吧O(∩_∩)O 文章目录 目录 文章目录 前言 大家好请上车 一、逆序字符串 题⽬描述&#xff1a; 输⼊⼀个字符串&#xff0c;写…

Node.js版本对比

目录 1. node版本与Npm版本对照表 2. node版本与node-sass版本对照表 3. node-sass与sass-loader版本对照表 1. node版本与Npm版本对照表 以往的版本 | Node.js 下面显示最新的对应内容&#xff0c;如果需要查找历史版本&#xff0c;可以进入上面的页面查询 VersionLTSDateV8np…

使用CRA(create-react-app)初始化一个完整的项目环境(该初始化项目已上传到本文章的资源)

1. 整理项目结构&#xff0c;项目目录结构大致划分如下&#xff1a; 2. 安装sass 安装sass开发环境, 注意&#xff1a;使用的文件后缀名要用.scssnpm i sass -D3. 安装Ant Design npm i antd --save 4. 配置基础路由Router&#xff08;具体可参考ReactRouter使用详解&#x…

Kerberos安装教程与命令详解(超详细)

文章目录 前言一、安装准备1. 搭建集群2. 软件包介绍 二、使用shell脚本一键安装1. 复制脚本2. 增加执行权限3. 执行脚本 三、kdb5_util命令1. 简介2. 可用选项和命令的解释3. 常见命令及其说明4. 示例用法 四、kadmin命令1. 简介2. 可用选项和命令的解释3. 常见命令及其说明4.…

渗透测试——1.4主动扫描

主动扫描是别人可以发觉的情报收集 一、nmap的使用 1.nmap<目标主机>:最常用的扫描方式 有nmap版本、扫描时间 “host is up”表示目标主机处于开机状态、“not shown”未开放端口 有四个端口是开的&#xff08;135.139.445.912&#xff09; 2.nmap -p<端口范围…

折叠屏,移动办公的第二战场

当下的移动办公&#xff0c;正在转换战场。 从PC端到移动端&#xff0c;大屏链接小屏&#xff0c;协作模式从单人到团队&#xff0c;移动办公领域一直在发展和自我更新&#xff0c;这也是硬件和软件企业共同开辟的“第一战场”。 如今&#xff0c;折叠屏带来了新形态&#xf…

Kafka、RocketMQ、RabbitMQ消息丢失可能存在的地方,以及解决方案

这里主要对比&#xff1a;Kafka、RocketMQ、RabbitMQ 介绍一下消息生产、存储、消费三者的架构形式。 消息丢失可能存在的场景&#xff1a; 情况一&#xff1a; 生产者发送给MQ的过程消息丢失 在写消息的过程中因为网络的原因&#xff0c;还没到mq消息就丢失了&#xff1b;或…

vue3+elementPlus+cascader动态加载封装自定义组件+v-model指令实现父子通信

文章目录 select普通操作 &#xff08;1&#xff09;cascader操作&#xff08;2&#xff09; select普通操作 &#xff08;1&#xff09; 搜索条件需求&#xff1a;接口入参需要houseId&#xff0c;但是要先选择完楼栋&#xff0c;再选择单元&#xff0c;最后选择房屋 如图&a…

vue2、vue3状态管理之vuex、pinia

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、状态管理之vuex1.1 State调用&#xff1a;1.2 Mutation在vuex中定义&#xff1a;在组件中使用&#xff1a; 1.3 Action在vuex中定义&#xff1a;将上面的减…

k8s是什么

生么是k8s&#xff1a; Kubernetes:8个字母省略&#xff0c;就是k8s 自动部署&#xff0c;自动扩展和管理容器化部署的应用程序的一个开源系统、 k8s是负责自动化运维管理多个容器化程序的集群&#xff0c;是一个功能强大的容器编排工具。 分布式和集群化的分布式进行容器管…

关于MySQL、分布式系统、SpringCloud面试题

前言 之前为了准备面试&#xff0c;收集整理了一些面试题。 本篇文章更新时间2023年12月27日。 最新的内容可以看我的原文&#xff1a;https://www.yuque.com/wfzx/ninzck/cbf0cxkrr6s1kniv MySQL 索引 说一下有哪些锁&#xff1f; 行锁有哪些&#xff1f; 性能优化 分库分表…

GrayLog日志平台的基本使用-ssh接入Dashboards展示

这里使用的版本为graylog4.2.10 1、一键安装graylog4.2.10&#xff0c;解压zip包&#xff0c;执行脚本就行 链接&#xff1a;https://pan.baidu.com/s/11U7GpBZ1B7PXR8pyWVcHNw?pwdudln 提取码&#xff1a;udln 2、通过rsyslog采集系统日志&#xff0c;具体操作参考前面文…