libgdx什么纹理尺寸?

时间:2016-02-25 12:45:39

标签: libgdx size textures

我应该使用什么尺寸的纹理,所以它在Android和桌面上看起来不错,而且在Android上性能很好?我是否需要为Android 创建桌面纹理的纹理?

2 个答案:

答案 0 :(得分:4)

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

据我所知,您只需要提供bigest(上例中的1024 * 1024)TextureLibgdx将在运行时创建mipmap链。
引擎盖下的OpenGL然后根据Pixel to Texel比率决定使用哪个Texture 看一下Texture API,似乎有一个2参数构造函数,第一个参数是FileHandle的{​​{1}},第二个参数是Texture ,表明您是否要使用mipmap。 我记得你也必须设置正确的boolean 要知道TextureFilter给你什么,我建议你阅读this article

答案 1 :(得分:4)

对于典型的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)的大小没有直接关系。您通常希望将纹理中的区域大小保持为“像素完美”。这意味着理想情况下它应该与投影到屏幕上一样大。例如,如果图像(或Sprite)在屏幕上投影100 x 200像素,那么您的图像(TextureRegion)理想情况下将为100 x 200像素尺寸。你应该尽可能地避免不必要的缩放。

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

如果目标设备的屏幕分辨率变化很大,那么您将不得不使用策略来处理它。虽然这不是你提出的问题,但记住它可能是件好事。根据您的需要,有几种选择。

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

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

另一种选择是将目标设备划分为不同的类别。例如“HD”,“SD”等。每组具有不同的平均分辨率,并且通常具有不同的最大纹理尺寸。这为您提供了两全其美,它允许您使用最大的纹理大小,而不必扩展太多。 Libgdx带有ResolutionFileResolver,它可以帮助您决定在哪个设备上使用哪个纹理。或者你可以使用例如根据设备规格不同的APK。