GPU架构杂乱备忘——IMR、TBR、TBDR

原文:https://juejin.cn/post/6844904132864655367

GPU架构杂乱备忘——IMR、TBR、TBDR

之前觉得涉及到gpu架构相关的问题只需要知道个大概就好,毕竟在图形api的层面上应该把硬件的细节给隐蔽掉,gpu的架构千千万万,每家厂商每个型号都不一样,开发者没必要掉进这个细节里面。但是最近重看Metal,特别是2.0之后新增的功能,逐渐深刻意识到一个事实——图形api已经迎来了真正的第三代。当然DX12、Vulkan和Metal在诞生时就打出了“现代图形api”的旗号,与传统api划出界限,我也只算是后知后觉。这些现代图形api的一个特点就是开放更多操纵硬件的细节,全权交给开发者来定夺。不过真正让我觉得有必要深入了解一下gpu架构的原因却是Metal在面对桌面级gpu和移动级gpu给出了差异相当大的两套api,这也让桌面端和移动端的图形编程变得截然不同。

桌面级gpu架构——IMR(Immediate Mode Rendering)

IMR就是我们普遍熟悉和使用的gpu架构,以n卡为例从Tesla发展到Turing依旧还是IMR架构。这种架构也和之前的图形api与渲染管线天然契合。每一个绘图的指令来到显卡,显卡便立即执行,从头到尾跑完整个管线,最终将结果输入到Frame Buffer中。但是这种架构有一个问题,在开启深度测试后,每个fragment的输出都要和Depth Buffer中的深度值进行深度测试,如果通过测试则需要更新Depth Buffer和Frame Buffer。这个过程包括了对System Memory的一次读取和两次写入,而fragment的数量巨大,这样就带来了很大的访问System Memory的压力。而IMR的解决办法则是给gpu配备足够大缓存和足够大的带宽。不过代价却是显卡为了容纳下更多缓存使得主板越来越大,并且频繁大量的带宽访问造成巨大的耗电与发热而不得不增加单独的风扇。这些代价在桌面电脑上尚能接受,可到了移动端就变成了洪水猛兽。无论是物理空间还是耗电对于移动设备来说都弥足珍贵,也因此不得不推出一种全新的gpu架构

移动级gpu架构——TBR(Tile Based Rendering)

TBR架构在gpu很近的位置增加了一片高速缓存,通常被称为Tile Memory(图中也叫On-Chip Buffer)。受限于成本、耗电等原因这块缓存不会很大,大概几十k这个量级。首先整个屏幕的画面会被分割成无数个小块,被称为tile,通常32*32大小,这样Tile Memory中足够容纳得下这个tile的相关数据。当一个绘图指令抵达显卡时,不在像IMR一样立即完成渲染,而是将通过vertex shader和裁剪后的顶点数据,根据所在tile进行分组,并将分组后数据存储到System Memory中,这块缓存也被称为Parameter Buffer (PB, 图中Primitive List和Vertex Data),然后处理下一个绘制指令。当所有绘制指令的顶点数据都做好处理存进PB或是PB达到一定容量之后才开始进行管线的下一步,即显卡会以tile为单位从PB中取回相应的顶点数据,进行光栅化、fragment shader以及逐片元处理。原本在逐片元处理中需要频繁的访问System Memory变为代价极低的对Tile Memory的访问。直到这个tile的frament将数据全部更新到Tile Memory上之后,再将该Tile Memory中的数据写回System Memory,然后执行下一个tile的处理。相比于imr零碎的大量的不可估计的对于System Memory的读写操作,TBR中变为了有限的(和tile数量一致)整块的写操作。虽然PB也在System Memory上,但是对于PB的访问是顶点数量级的(显然vertex要远小于fragment)且数据会经过特殊的压缩处理,所以这个置换依旧值当。

不过这种架构也带来了一些问题,因为渲染管线会在中途中断,这就导致在这时切换Frame Buffer变得异常麻烦。TBR的做法是会将缓存的渲染数据全部强制绘制,绘制完毕后再些换到新的Frame Buffer,这无形中就增加Tile Memory和System Memory之间数据的拷贝。也因此在移动设备上切换Frame Buffer的使用要十分慎重。但从另一方面来看那些渲染数据并没有立刻渲染,而是缓存了起来,这也带来了很大的优化空间。

更强的移动级gpu架构——TBDR(Tile Based Deferred Rendering)

将TBDR放在这里可能会造成一种误解,认为TBDR是TBR的升级版。事实上,TBDR的是Imagination公司所独有的一种移动级gpu架构,被广泛应用于旗下PowerVR等产品中。由于其相比同时期其他TBR架构的显著优势受到苹果公司的青睐,而被搭载到iphone上。近几年iphone已经开始使用完全自研的A系列处理器也依旧是延续着TBDR架构。TBDR的优势在于利用PB中缓存的顶点数据,提前对流入到管线剩余部分的片段进行了筛选,来解决传统渲染管线的一个老大难问题——过度绘制(over draw),而实现这一步的关键就在于HSR(Hidden Surface Removal)技术。

如上图所示Image Synthesis Processor (ISP)从PB中逐图元的取回当前tile的顶点数据(只有顶点数据),ISP会对数据进行差值并对差值得到的片元数据计算深度,并进行深度和模板测试。如果通过测试,则更新片上的深度和模板缓存,同时在tag buffer中记录该片元的图元id。当一个tile的所有图元都经过ISP的处理后,tag buffer中便会得到每个像素所对应的唯一可见的图元id。然后对这些可见的图元,以图元为单位从PB中取回顶点之外的其他varying数据(比如uv之类)通过TSPF进行差值,然后传给fragment shader。这也解释了TBDR总流程图中vertex data的两条分支,*1代表流入ISP的顶点数据,*2代表流出TSPF的其他数据。

TBDR也有一些弊端,比如那些在fragment shader中会丢弃的片元(alpha 测试)无法再fragment shader之前直到其是否需要绘制,因此对于这些片元需要通过上图中的GCS提前提交给fragment shader并计算出确切深度后返回给ISP,这个过程阻塞掉其他片元的计算,因此是一种比较昂贵的代价。另外对于半透明物体(alpha混合)由于一个片元的颜色不仅由最近片元决定,所以此时会强制绘制缓存的片元,这样便也增加了Tile Memory和System Memory之间的拷贝。因此应该将物体分组,先开启深度测试绘制非透明物体,再关闭深度测试绘制透明物体。

虽说HSR这种技术被Imagination申请了专利,并且在狭义上只有应用了HSR技术的显卡在能叫TBDR。但其他厂商也有自己针对TBR架构的优化,比如Arm的Forward Pixel Kill和骁龙的Flex Render都在力图减少过度绘制。同时在软件层面也有被称为TBD(Tile Based Deferred Shading)的着色管线,不过这和TBDR完全是两个层级的概念。

再看IMR、TBR和TBDR

IMR和TBR因为这块Tile Memory带来了完全不同的渲染流程,有些原本适用的法则,在移动端上则完全不一样。除了上面提到过的切换FBO,alpha测试以及alpha混合等问题。比如在IMR上,每一帧clear是完全不必要的,因为整个屏幕都会被重新绘制而覆盖掉上一帧的内容。但对TBR来说每一帧不clear则以为着需要在每一个tile开始的时候将上一帧的数据拷贝到Tile Memory中,为防止这种完全没必要的拷贝所以在TBR上需要每帧clear。如果考虑到TBR中Tile Memory的宝贵以及访问System Memory的难度,纹理采样也变成了一种昂贵的操作。纹理数据是存储在System Memory上,少量近期访问过的纹理会缓存在Tile Memory中,因此使用压缩纹理可以让有限的Tile Memory缓存更多的纹理数据,同时LUT(Look-Up Table)这种不符合空间局部性的纹理数据会大幅降低缓存命中应该少用。

TBR这样一种为了适合移动端种种限制而不得不诞生一种“妥协”的架构,虽有上述的种种限制,但却也带了意想不到威力。这块神奇的Tile Memory不仅带来了可以忽略的读写成本,也为渲染管线提供了一块临时的缓存。这块缓存的意义就在于,原本多个pass才能完成的渲染流程变成一个pass就可以。为了实现这种优化,在Metal 2.0中提供ImageBlock和Tile Shader等技术,允许开发者对Tile Memory上的数据进行编程,这也让移动端和桌面端渲染管线的实现有了极大的不同

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

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

相关文章

requests下载大文件_11种方法教你用Python高效下载资源!

在本教程中,你将学习如何使用不同的Python模块从web下载文件。此外,你将下载常规文件、web页面、Amazon S3和其他资源。最后,你将学习如何克服可能遇到的各种挑战,例如下载重定向的文件、下载大型文件、完成一个多线程下载以及其他…

android自定义push通知_20个海外Web和App推送通知服务工具

在App和网站中使用推送通知有不同的原因,并且在提高流量和与客户互动方面有很多好处。推送通知是一种交互式可点击消息,可将访问者直接引导至你的网站。它们可以帮助你以指数方式增加流量和参与率。因此,营销人员,广告商&#xff…

linux 删除文件_Linux删除文件夹命令有哪些

今天要和大家分享的Linux常用命令是Linux删除文件夹命令,Linux删除文件夹很简单,常用的命令有rmdir和rm,以下分别介绍一下,大家根据情况选择使用即可。 Linux删除文件夹命令有哪些 ①Linux删除文件夹命令:rmdir rmdir命令使用场景: 当有空目录要删除时,可使用rmdir指令。…

url上接收到 el表达式 不渲染_一文摸透从输入URL到页面渲染的过程

一文摸透从输入URL到页面渲染的过程从输入URL到页面渲染需要Chrome浏览器的多个进程配合,所以我们先来谈谈现阶段Chrome浏览器的多进程架构。一、Chrome架构目前Chrome采用的是多进程的架构模式,可分为主要的五类进程,分别是:浏览…

模拟弱网工具的使用

https://zhuanlan.zhihu.com/p/98185153 https://www.jianshu.com/p/5e35a3585df5 今年5G技术开始铺开并进入商用。随着5G的到来,不知道大家有没有和我一样的感受,希望是我心理作用吧,我发现作为一个4G用户,最近我的手机网速是不…

c语言计算a+aa+aaa_物业服务企业信用等级公布,42家获AAA级!你家小区物业怎么样?...

杭州住保房管 根据《浙江省物业服务企业信用信息管理办法》和《浙江省行业信用监管责任体系构建工作方案》,日前,省建设厅公布了 2020年度浙江省物业服务企业信用等级结果名单,杭州165家物业服务企业上榜,绿城物业服务集团有限公司…

python 可视化_python可视化基础

常用的python可视化工具包是matplotlib,seaborn是在matplotlib基础上做的进一步封装。入坑python可视化,对有些人来说如同望山跑死马,心气上早输了一节。其实学习一门新知识,首先要掌握的是这门知识的最少最核心知识,剩…

使用post访问不到接口_Postman工具使用说明

一、工具说明接口测试工具,支持post,get,请求的接口测试;支持参数中带token,带cookie等接口测试。印度阿三开发的产品,稳定性较好,强烈推荐,屡试很爽。适用:前后端分离的…

java正则表达式判断手机号_正则表达式学习之简单手机号和邮箱练习

正则表达式的组成规则在java中,正则表达式的编译是类java.util.regex.Pattern正则表达式的构造摘要1.字符x包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号的普通字符。比如之前的例子可以将[1-9][0-9]{4,12}改成1[0-9]{4,12}或者a[0-9]{4,12}此时就…

unity 解决引入dlopen api的问题

打包出来的ipa在腾讯的wetest的ios预审中报以下错误。 对于dlopen api, 是苹果禁用的,对Unity项目痛苦的挨个二分排查后,发现很多都有可能引入。 1.和XML或Excel相关的C# API极有可能引入。https://blog.csdn.net/qq_36622009/article/details/10388285…

运营体系_用户运营系统论:解构复杂产品的大规模用户运营体系

本文介绍了大规模用户运营体系中的三大原则——数据驱动、精细化运营、自动化(或叫产品化),以及用户运营体系中的三个子系统——用户生命周期管理系统、用户分层运营系统、用户行为激励系统。我们在实际的产品工作中,经常会用到各种各样的运营体系&#…

ShaderToy效果学习(转成Unity URP) - MathEye

来自IQ大神的小教程,效果图: shaderToy源码:https://www.shadertoy.com/view/lsfGRr 教程视频:https://www.bilibili.com/video/BV1KK4y1K7wM/ Unity项目代码Git地址:https://github.com/Dejavu0709/Graphics.git Sh…

asp 退出登录修改cookie能进入后台_深入浅出让你理解跨域与SSO单点登录原理与技术...

一:SSO体系结构SSOSSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务…

是可改写的随机存储器_关于存储器的一些基础知识整理

RAMRandom-Access-Memory,随机存储存储器,可读可写,分为SRAM和DRAM,即静态随机存储器和动态随机存储器,理解上静动态主要体现是否需要刷新,通常DRAM需要刷新,否则数据将丢失;SRAM的效率较好,而成…

fpga供电电压偏低会怎样_[走近FPGA]之开发板介绍篇

开发板概述在走近FPGA预告篇中,我们已经提到了系列文章使用的开发平台,硬木课堂Xilinx Artix 7 FPGA板,如下图所示。它使用的FPGA芯片型号为Xilinx Artix-7 XC7A75T,具有电平开关、LED、矩阵键盘、数码管等基本外设,同…

使用arm-linux-androideabi-addr2line 定位Unity Android 段错误

arm-linux-androideabi-addr2line是NDK中提供的将内存地址转换成行号的一个工具,通俗具体点就是根据各种日志,譬如trace日志和tomestone日志中包含的so库日志的中偏移内存地址,定位到具体是在那个文件的那一行。Unity的安装目录中&#xff0c…

springboot几种注入_Spring Boot中使用JdbcTemplate访问数据库

本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例。数据源配置在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式。首先,为了连接数据库需要引入jdbc支持,在pom…

搜索重复代码_LeetCode专题——详解搜索算法中的搜索策略和剪枝

今天是LeetCode专题第20篇文章,今天讨论的是数字组合问题。描述给定一个int类型的候选集,和一个int类型的target,要求返回所有的数字组合,使得组合内所有数字的和刚好等于target。注意:所有的元素都是正数所有元素没有…

Unity内实现Android APK版本更新

最近做项目有个需求是要Android应用内强更包体。Google一波直接选了一个android原生开源项目 GitHub - yangchong211/YCUpdateApp: 轻量级版本更新弹窗,弹窗上支持更新进度条,可以设置普通更新或者强制更新。解决8.0以上通知栏不显示问题,解…

a标签隐藏真实地址_家庭影院布线非常杂乱应该怎么补救?A/V电缆管理的7个技巧...

家庭影院应该是给人带来快乐的东西,不管是声音还是外观,但是如果您布的线很杂乱,那么想必整个影院也好看不到哪去,如果你想要整理的话,那么这篇文章应该能帮助到您。有没有整理过家庭影院的电线,观感是完全…