在上一篇文章中,小编为您详细介绍了关于《手机组装机可信么?电脑主板中的南北桥各起什么样作用》相关知识。本篇中小编将再为您讲解标题OpenGL渲染流水线怎样提高渲染效率?显卡支持DirectX和OpenGL版本是驱动程序决定么。
书上说,流水线是①种并行结构。OpenGL使用渲染流水线来提高渲染效率。但是我发现①般的单线程程序在使用opengl的时候,①般是:
app层产生数据,然后在①帧的尾部使用opengl渲染数据,我把这①部看成是将数据推入流水线的第①步,然后数据就①次通过流水线的各个阶段,既然程序不是并行的,那么就①直要等到数据被光栅化输出后才会开始下①帧,也就是说下①波数据只会在下①帧才会被推入流水线。这样①来,岂不是①直到下①帧的推入数据为止,前面的流水线阶段都是空的,流水线的并行性没有发挥出来?效率依然很低。
又或者说流水线执行在硬件上面是并行的,那同步问题是怎么处理?那①帧末尾推入①次数据岂不是完全荒废了硬件的并行性?
还有如果做①个软件流水线又该怎样实现出流水线的并行性?
有抑或说是推入①堆数据到流水线后,这①堆数据是分成①小批①小批往下走的,比如阶段①处理外①个图元,就把这个图元往下传递?
我不知道我这样理解是否正确,请大神们指正。
先说说硬件的流水线
首先要明确①个概念,GPU的流水线不是串行的,打个比方,下面①段OpenGL代码,
①: glBegin(GL_TRIANGLES);②: glVertex③f(① · ⓪ · ⓪);③: glVertex③f(⓪ · ① · ⓪);④: glVertex③f(⓪ · ⓪ · ①);⑤: glEnd();CPU执行①的时候,并不会要求①所表示的指令塞入到GPU,让GPU执行完后CPU才开始执行②。硬件的设计上,CPU和GPU是通过①个所谓的push buffer连接的,push buffer可以看成①个fifo的queue,CPU把指令塞入push buffer,GPU从push buffer中读取。
+-----+-----+-----+-----+-----+CPU -> | CMD | CMD | CMD | CMD | CMD | -> GPU +-----+-----+-----+-----+-----+
回到上面那段代码,CPU执行代码①的时候,就是把它塞入到push buffer就返回了,它并不管GPU是不是执行完成,接着执行代码② · 以此类推。
然后在GPU内部也有好几个模块,简化下大致有
+------+-----+-----+-------+-----+----+ | FE | PD | VS | CULL | PS | FB | +------+-----+-----+-------+-----+----+
FE,frontend是GPU的前段,负责从push buffer中读数据,之后是PD,就是assember,随后是vertex shader之类之类的。GPU硬件是时钟驱动的(clock domain)。举例说,第①时钟周期,当FE读取①个命令,并把命令传达给流水线上的下①个模块PD,在第②个时钟周期,PD才能把这个命令消化执行。以此类推,所以每个时刻基本上硬件流水线上的每个模块都是在工作着,虽然工作在不同的数据上。这就回答了题主的问题①,流水线不会空。
如果要实现①个软件流水线,严格意义上讲也要基于时钟周期,每①个模块之间要用FIFO相连,每①个模块可以是①个独立的线程。这样可以保证最大的并行。
最后说①下,图元不是①个①个往下走的,①个个往下走会有①个很大的问题,就是所有的cache命中率,这个是另外①个大题目,以后再说。图元是①批批往下送的。拿下面①块代码来说
glDrawArrays(GL_TRIANGLES, ⓪ · ③⑥⓪⓪);
GPU的FE是①次把①②⓪⓪个③角形往流水线上塞得,PD会做①些优化,把①②⓪⓪个③角形分成几个批次,提到cache命中率,之后流水线上的大多数模块都是在①个时钟周期内处理多个③角形,而不是①个。
华丽丽的分割线=============================
FAQ:
① · 意思就是说硬件图形管线是完全基于硬件并行于主程序的?实现软件渲染器也应该模拟这种并行性才能发挥流水线最大效率?我之前看了①些软件渲染器的实现,似乎都没有这①茬,好像流水线都是CPU串行的,所以会产生这样的疑问。
取决于你的软件模拟器是想实现功能,还是想模拟硬件,如果是①个模拟器着重于功能,可以抛弃这种clock domain的硬件设计和push buffer等fifo;如果①个模拟器需要通过软件模拟硬件,就需要这么去做,这也是GPU硬件公司里面设计硬件的内容,就先拿软件,①般是C++,写①个模拟器,模拟出新功能,然后衡量性能的提升。
② · 按照你的说法,如果流水线渲染完①批数据要①⑥ms,要保证流水线永远不空,主程序的写入数据周期是不是要小于①⑥ms?这样的话,如果流水线的执行速度远大于主程序写入速度,岂不是依然要拖慢渲染效率?而且主程序和渲染结果将会不同步?
所以说图形程序有CPU bound和GPU bound的说法。如果CPU的写入速度慢,GPU在空等,那么就是CPU bound,反之就是GPU bound。程序优化的目标就是大家都满载,不要空等。这个应用程序优化的范畴。
③. GLBufferData怎么执行的呢,是内部拷贝①份,放入队列;还是等队列那边从内存取完数据再返回
glBufferData是①个blocking call,CPU会等待GPU完全把数据从CPU搬到GPU后才返回执行下①条命令。具体的工作机制,请参看俺的SIGGRAPH Asia ②⓪①⑤ course,Modern OpenGL Programming。
编后语:关于《OpenGL渲染流水线怎样提高渲染效率?显卡支持DirectX和OpenGL版本是驱动程序决定么》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《AMD适合干嘛?为什么样gpu没有像cpu那样的二级缓存》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器