【发布时间】:2010-10-06 14:03:09
【问题描述】:
当我们使用带有 glEnable(GL_BLEND) 的 opengl 2.0 在 iPad 上绘制 300 个精灵时(我们需要它,因为精灵需要透明度和 alpha 混合),我们得到大约 40 的帧率。但是当我们禁用混合时,我们得到一个帧率60 个。
现在(alpha)混合真的那么昂贵还是我们做错了什么?
感谢您的宝贵时间, 理查德。
【问题讨论】:
当我们使用带有 glEnable(GL_BLEND) 的 opengl 2.0 在 iPad 上绘制 300 个精灵时(我们需要它,因为精灵需要透明度和 alpha 混合),我们得到大约 40 的帧率。但是当我们禁用混合时,我们得到一个帧率60 个。
现在(alpha)混合真的那么昂贵还是我们做错了什么?
感谢您的宝贵时间, 理查德。
【问题讨论】:
Alpha 混合确实是那么昂贵。问题是你可以通过使用 Z-Buffering 解决很多过度绘制问题(PowerVR 非常擅长的)。它可以通过不写入 Z 缓冲区和绘图缓冲区来节省大量内存带宽。
当您开始 Alpha 混合时,您需要立即从帧缓冲区混合中读取数据,然后再写回(Read-Modify-Write 或 RMW)。实际上,如果您有 10 个重叠的精灵,那么它们需要绘制 10 次,而对于 Z-Buffered(同样是 .. PowerVR 在前面很奇怪)未混合系统,您实际上只需要绘制一个像素。因此,在这种边缘情况下,您只需不进行 alpha 混合就可以节省十分之一的 WRITE 带宽。并且不要忘记,除此之外,还需要从帧缓冲区读取以进行 Alpha 混合。
正如我所提到的,当涉及 Z 缓冲时,它确实会变得更加复杂。主要是因为 Z-buffer 需要读取、比较和可能的写入,但是使用 Z-buffering 您可以在管道中更早地丢弃像素,这意味着您可以节省更多的处理时间。再加上 PowerVR 仍然使用的平铺系统,我相信你主要担心的是 RMW 带宽损失到 alpha 混合。
【讨论】:
真的很贵。它需要对每个像素进行读取-修改-写入。修改操作的形式为
fragment * alpha + previous * (1 - alpha)
数一数您执行此操作的像素数,您很快就会意识到您做了很多数学运算(并且需要更多的内存带宽)。这完全取决于你的精灵有多大,但是当你有很多透支时,大幅减速也就不足为奇了。
【讨论】: