我听说glBindTexture
非常慢,必须尽可能避免,但是对于用C ++编码的2D平铺OpenGL游戏(每帧最多约400块瓷砖),是一种纹理地图集真的需要吗?同样重新计算每个图块的纹理坐标的开销实际上小于仅在需要时更改纹理的开销(我逐行绘制图块并且当下一个图块与当前图块不同时仅调用glBindTexture
)?
编辑:图块为32x32像素,因此所有图块都适合一个图集
答案 0 :(得分:4)
如果你只是有点幸运的话,根据你的使用模式,绑定另一个纹理可能比你认为的便宜。现代GPU具有多个纹理集,驱动程序可以相对容易地切换(有点lengthier explanation)。特别是如果你在一组中等变化的瓷砖之间进行切换,很有可能它不会完全失速。
然而事情是,你不知道。它也可能只是不同。只要你不知道,你应该假设最坏的情况而不是最好的情况
另外,可怕的管道停顿并不是纹理绑定中唯一可能昂贵的东西。 GL必须至少取消引用两个指针(高速缓存未命中的可能性很高),并在绑定对象后对对象和整个renderstate进行一些非平凡的一致性检查。
那些缓存效果和一致性检查是一个问题,它们是nVidia仍在研究“无绑定图形”的原因。他们称之为“新瓶颈”。
所有可能对桌面计算机上的500状态更改无关紧要,但正如Goz已经指出的那样,将在手持设备上重要。如果没有别的(即使它不影响帧速率),它将导致电池更快耗尽 这是一个遗憾,因为它完全没有必要,纹理图集很容易实现,并且没有任何开销,所有涉及的计算都是微不足道的(因为你不使用mipmap)。
答案 1 :(得分:3)
是的确有所作为。虽然它是否会影响您的帧速率,但这在很大程度上取决于许多因素,例如硬件或每个磁贴的分辨率。一般来说,虽然纹理图案没有任何损害,但它会提供更好的性能。
此外,由于您可能无法将所有图块放在同一图集中,因此渲染所有使用给定纹理图集的图块然后更改为下一个纹理图集并渲染所有图块会更加明智。使用那个的瓷砖。这样,您只需更改纹理,就像场景中有纹理图集一样。
这在手持设备(iOS,Android等)上变得非常重要,但即使在高端PC上,性能提升也会非常显着。