libgdx 什么纹理大小?

libgdx What texture size?

我应该使用多大的纹理才能使其在 android 和桌面上看起来不错并且在 android 上性能良好?我是否需要为 android 创建桌面纹理?

最好的方法(关于性能 + 质量)是使用 mipmap。 这意味着您从一个大的 Texture(例如 1024*1024 像素)开始并将其下采样到其大小的四分之一,直到您达到 1x1 图像。 所以你有一个1024*1024、一个512*512、一个256*256……和一个1*1Texture

据我所知,您只需提供最大的(上例中为 1024*1024)TextureLibgdx 将在运行时创建 mipmap 链。
引擎盖下的 OpenGL 然后根据像素与纹理元素的比率决定使用哪个 Texture
看一下 Texture API,似乎有一个 2 参数构造函数,其中第一个参数是 TextureFileHandle,第二个参数是 boolean ,表示您是否要使用 mipmap。 据我所知,您还必须设置正确的 TextureFilter.
要了解 TextureFilter 对您有何意义,我建议您阅读 this article

对于典型的 2D 游戏,您通常希望使用所有目标设备支持的最大纹理大小。这样您就可以将最多的图像 (TextureRegion) 打包到单个纹理中,并尽可能避免多次绘制调用。为此,您可以检查要支持的所有设备的最大纹理大小并取最小值。通常具有最小尺寸的设备也具有较低的性能,因此没有必要为其他设备使用不同的纹理尺​​寸来提高整体性能。

不要使用比你需要的更大的纹理。例如。如果您的所有图像都适合单个 1024x1024 纹理,那么使用例如2048x02048 纹理,即使您的所有设备都支持它。

规范保证至少 64x64,但实际上所有设备都至少支持 1024x1024,大多数较新的设备至少支持 2048x2048。如果你想检查特定设备上的最大纹理大小,那么你可以 运行:

private static int getMaxTextureSize () {
    IntBuffer buffer = BufferUtils.newIntBuffer(16);
    Gdx.gl.glGetIntegerv(GL20.GL_MAX_TEXTURE_SIZE, buffer);
    return buffer.get(0);
}

最大值始终为正方形。例如。此方法可能会为您提供 4096 的值,这意味着支持的最大纹理大小为宽度为 4096 纹素,高度为 4096 纹素。

您的纹理大小应始终为 2 的幂,否则某些功能(例如 wrap 函数和 mipmap)可能无法工作。它不一定是方形的。因此,如果您只有 2 张 500x500 的图像,那么使用 1024x512 的纹理就可以了。

请注意,纹理大小与您打包在其中的单个图像 (TextureRegion) 的大小没有直接关系。您通常希望尽可能将纹理内区域的大小保持为 "pixel perfect"。这意味着理想情况下它应该和投影到屏幕上的一样大。例如,如果图像(或 Sprite)在屏幕上投影为 100 x 200 像素,那么您的图像(TextureRegion)的理想尺寸为 100 x 200 纹素。您应该尽可能避免不必要的缩放。

投影大小因设备(屏幕分辨率)而异,并且与您的世界单位无关(例如您的 ImageSpriteCamera 的大小)。您必须检查(或计算)特定设备的确切预计尺寸才能确定。

如果您的目标设备的屏幕分辨率变化很大,那么您将不得不使用一种策略来处理它。尽管这并不是您真正要问的,但记住它可能是件好事。根据您的需要,有几个选项。

一种选择是在中间某处使用一种尺寸。一个常见的错误是使用太大的图像并将它们缩小很多,这在低分辨率设备上看起来很糟糕,占用太多内存并导致大量渲染调用。相反,您可以选择放大和缩小仍然可以接受的分辨率。这取决于图像的类型,例如直线水平和垂直线比例非常好。字体或其他高细节图像不能很好地缩放。试试看吧。通常,您永远不希望比例因子超过 2。因此,放大超过 2 或缩小超过 2 很快就会看起来很糟糕。越接近1越好。

正如@Springrbua 正确指出的那样,您可以使用 mipmap 进行比 2 更好的缩小(mipmap 无助于放大)。但是,这有两个问题。第一个是它会导致从一个区域流到另一个区域,以防止您可以增加图集中区域之间的填充。另一个是它会导致更多的渲染调用。后者是因为分辨率较低的设备通常也具有较低的最大纹理大小,即使您永远不会使用该最大值,它仍然必须加载到该设备上。不过,只有当您的图像数量多于最小尺寸无法容纳的图像时,这才会成为问题。

另一种选择是将目标设备分类。例如 "HD"、"SD" 等。每组都有不同的平均分辨率,通常也有不同的最大纹理大小。这为您提供了两全其美的方法,它允许您使用最大的纹理大小而不必缩放太多。 Libgdx 附带 ResolutionFileResolver 可以帮助您决定在哪个设备上使用哪个纹理。或者,您可以使用例如根据设备规格不同的 APK。