2

libGDX 文档解释了如何将纹理绑定到 SpriteBatch...

如果 [SpriteBatch] 被赋予与上一个纹理不同的纹理,则它绑定最后一个纹理,提交收集的要绘制的几何图形,并开始为新纹理收集几何图形。

每隔几个绘制的矩形更改纹理会阻止 SpriteBatch 批量处理大量几何体。此外,绑定纹理是一项昂贵的操作。由于这些原因,通常将许多较小的图像存储在较大的图像中,然后绘制较大图像的区域以最大化几何批处理并避免纹理更改。

出于这个原因,我将我所有的游戏精灵图像排列成一个纹理。但是,我现在希望在我的游戏中放置一个大的背景图像来填满整个屏幕。

我的选择似乎是...

  1. 将背景放在我用于较小游戏精灵的相同纹理中,或者...

  2. 使用单独的纹理作为背景。

#1的问题是,如果我想为不同的级别使用不同的背景图像,这似乎非常不切实际(我的图像变得非常大,或者我必须为每个不同的背景在多个图像中复制我的游戏精灵)

但是如果我做#2,那么我必须在每次提交到 GPU 之前将 SpriteBatch 绑定到 2 个不同的纹理,文档将其描述为“相当昂贵”。

我不知道最好的方法是什么。我真的需要担心绑定到多个纹理吗?或者有没有我没有考虑过的更好的方法?

寻求任何建议,谢谢!

4

1 回答 1

4

如果已经很大的纹理不会经常使用,您应该尽量避免将它们打包在相同的纹理(图集)中,就像所有其他小的且经常使用的纹理一样。

为什么是这样?因为许多设备会迫使您仅使用两个 (POT) 大小的纹理的幂,并且在您想要放在一起的大纹理的情况下,这可能会导致一个非常大的文件并浪费大量空间。

此外,如果您有 10 个级别,每个级别都有不同的背景,并且您会将所有背景放在一个纹理中,那么您就没有机会仅将一个背景发送到您的 GPU。在每个关卡中,您都必须将具有所有背景的巨大纹理文件发送到 GPU,以便仅显示其中一个。因此,它不仅会浪费空间,还会浪费 GPU 内存,更糟糕的是。

由于这些原因,并且因为您通常只绘制一次背景,您可以忽略单个纹理切换的开销。它并不昂贵如果你每帧只做一次(在背景的情况下)它不会有什么不同。

所以总的来说:将背景纹理与其他纹理分开,并将它们制作成单独的文件。

于 2014-03-21T10:40:09.120 回答