在iPad上绘制2D精灵时出现GL_BLEND问题

3

当我们在iPad上使用opengl 2.0和glEnable(GL_BLEND)绘制300个需要透明度和alpha混合的精灵时,我们得到了大约40帧的帧率。但是,当我们禁用混合时,我们得到了60帧的帧率。

现在,混合真的那么昂贵吗?还是我们做错了什么?

感谢您的时间, Richard。

2个回答

4
混合透明确实非常耗费资源。问题在于,使用Z缓冲可以解决很多过度绘制的问题(PowerVR非常擅长此项技术)。通过不写入Z缓冲和绘制缓冲区,可以节省大量内存带宽。
一旦开始混合透明,就需要立即从帧缓冲区读取、混合并再次写入(读-修改-写或RMW)。如果有10个重叠的精灵,则需要绘制10次,而使用Z缓冲区(PowerVR在这方面有点奇怪)未混合的系统,实际上只需要绘制一个像素。因此,在这种边缘情况下,仅通过不进行混合透明即可节省十分之一的写入带宽。此外,还要考虑到混合透明所需的帧缓冲区读取。
正如我所提到的,当涉及Z缓冲时,情况会变得更加复杂。主要是因为Z缓冲需要读取、比较和可能的写入,但使用Z缓冲,可以更早地在流水线中丢弃像素,从而节省更多处理时间。再加上PowerVR仍然使用的平铺系统,您的主要关注点是RMW带宽损失与混合透明。

1

这真的很昂贵。每个像素都需要进行读取-修改-写入操作。修改操作的形式如下:

fragment * alpha + previous * (1 - alpha)

计算你所涉及的像素数量,你很快就会意识到你需要进行大量的数学计算(并需要更多的内存带宽)。这完全取决于你的精灵有多大,但当你有大量的重叠时,减速是不足为奇的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接