libGDX渲染大背景图像的最佳方法是什么?

时间:2014-03-21 10:28:33

标签: background textures libgdx spritebatch

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

  

如果[SpriteBatch]的纹理与最后一个纹理不同,则它会绑定最后一个纹理,提交要绘制的收集几何体,然后开始收集新纹理的几何体。

     

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

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

我的选择似乎要么......

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

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

  3. #1的问题在于,如果我想在不同级别使用不同的背景图像(或者我的图像变得非常大,或者我必须在每个图像的多个图像中都有我的游戏精灵副本),这似乎非常不切实际。不同的背景)

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

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

    寻求任何建议,谢谢!

1 个答案:

答案 0 :(得分:4)

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

这是为什么?因为许多设备只会强制你使用两个(POT)大小的纹理,如果你想要组合大纹理,这可能会导致一个非常大的文件,浪费很多空间。

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

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

总的来说:从其余部分分离背景纹理并将它们作为单独的文件。