“精灵批处理”的技术定义是什么?


17

平台和语言不可知,如何定义精灵批处理?似乎有许多不同的技术可以减少绘图时的工作量,并且它们常常与“批处理”混为一谈。在我看来,可能没有一个真正的答案,但也许有人在这里找到了我没有的答案。

Answers:


14

从技术上讲,“批处理”将多个操作及其数据放入一个数据结构中,因此所有这些操作都可以一次执行,而不必单独执行。

现代GPU的最大瓶颈不是其工作能力,而是在CPU和GPU上运行的游戏之间的通信。发送到GPU的每个数据包都有开销,但是小包的开销和大包的开销一样大,因此,当您发送一个大包而不是一百个小包时,这是一个很大的收益。这就是批处理。从所有较小的包装中制成一个大包装。

批处理对于Sprite尤其有用,因为每个Sprite的数据量非常少。四个顶点和四个tex坐标。因此,小包装的制造费用成比例地增加。


1
+1提及延迟问题;这是同样的原理,也适用于网络流量和磁盘I / O-在一般情况下,很少有大批量的产品胜过许多小批量的产品。
Maximus Minimus 2012年

9

精灵批处理是通过一次绘制调用将多个精灵提交给GPU的方法。

其他答案都没有指出这样做的真正意义:最小化状态更改和GPU命令提交。如果您绘制了100个精灵,每个精灵都有自己的纹理,则硬件一次只能处理一个精灵。数十个甚至数千个着色器核心最终几乎没有被利用,GPU为配置纹理切换花费了太多时间来配置其渲染状态。

如果将所有精灵图像放入地图集中,则可以最大程度地减少绘制所需的状态变化。驱动程序甚至可以自动将子图形绘制请求合并为一个批处理,以便可以充分利用硬件,但这不能保证或不可能。

如果使用子画面图集,然后创建一个包含所有子画面四边形的单个VBO,并使用该数据进行单个绘制请求,则可以确保硬件得到充分利用,并且所有子画面都可以并行渲染。

然后,精灵批处理就是这样做的:使用一个图集将尽可能多的精灵放入一个VBO中,该图集通过一次绘制调用提交给GPU,从而最大限度地利用了GPU。

还有其他方法可以进行精灵批处理(例如硬件实例化,使用几何着色器等),以及这样做的其他好处,但是要点是批处理意味着每个绘制调用都绘制多个对象。


-1:最小化状态更改不是批处理的“重点”。这只是OpenGL的结构要求。(这是纹理地图集的要点,但并未提出要求。)该问题专门要求提供“平台和语言不可知论”的定义。
API-Beast 2012年

那么,将所有内容都绘制到后缓冲区的方法如何解决此问题呢?难道不是仍然一次将数据处理到内存中的单个图像,然后再推送到前端缓冲区吗?我认为我的理解一定有点缺陷。
Bloodyaugust

4
Beast先生:与OpenGL或任何平台或语言均无关。这就是硬件本身在所有平台和使用任何语言的所有图形API上实际工作的方式。
肖恩·米德迪奇

6

这不是一个严格定义的技术术语。批处理基本上是将您作为一组执行多个操作而不是单独执行多个操作的任何系统,通常这样做是因为这样做更有效。效率提高通常来自能够重用操作所需的部分或全部上下文。

因此,子画面批处理只是允许您一次绘制多个子画面并希望从中获得一定效率的任何系统。通常的好处是您的Sprite批处理全部使用相同的纹理,因此您可以在不更改纹理的情况下绘制批处理中的所有Sprite,这是一个相对较慢的操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.