【发布时间】:2023-03-28 02:02:01
【问题描述】:
我应该为我的纹理使用什么尺寸,这样它在 Android 和桌面上看起来不错并且在 android 上的性能很好?我是否需要为安卓和为桌面创建纹理?
【问题讨论】:
我应该为我的纹理使用什么尺寸,这样它在 Android 和桌面上看起来不错并且在 android 上的性能很好?我是否需要为安卓和为桌面创建纹理?
【问题讨论】:
对于典型的 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 texel。您应该尽可能避免不必要的缩放。
投影大小因设备(屏幕分辨率)而异,并且与您的世界单位无关(例如,您的 Image 或 Sprite 或 Camera 的大小)。您必须检查(或计算)特定设备的确切投影尺寸才能确定。
如果您的目标设备的屏幕分辨率变化很大,那么您将不得不使用一种策略来处理它。尽管这不是您真正要求的,但请记住这一点可能很好。有几个选项,具体取决于您的需要。
一种选择是在中间的某处使用一种尺寸。一个常见的错误是使用太大的图像并将它们缩小很多,这在低分辨率设备上看起来很糟糕,占用太多内存并导致大量渲染调用。相反,您可以选择放大和缩小仍然可以接受的分辨率。这取决于图像的类型,例如直线水平和垂直线的比例非常好。字体或其他高细节图像不能很好地缩放。试一试。通常,您永远不想拥有超过 2 的比例因子。因此,无论是按比例放大超过 2 倍还是按比例缩小超过 2 倍,都会很快看起来很糟糕。越接近1越好。
正如@Springrbua 正确指出的那样,您可以使用 mipmaps 来获得比 2 更好的缩小比例(mipmaps 对放大没有帮助)。但这有两个问题。第一个是它会导致从一个区域到另一个区域的出血,以防止您增加图集中区域之间的填充。另一个是它会导致更多的渲染调用。后者是因为分辨率较低的设备通常也具有较低的最大纹理大小,即使您永远不会使用该最大值,它仍然必须加载到该设备上。仅当您的图片数量超过了最小最大尺寸时,这才会成为问题。
另一种选择是将目标设备分类。例如“HD”、“SD”等。每组有不同的平均分辨率,通常也有不同的最大纹理尺寸。这为您提供了两全其美的优势,它允许您使用最大的纹理大小,而不必缩放太多。 Libgdx 带有ResolutionFileResolver,它可以帮助您决定在哪个设备上使用哪种纹理。或者,您可以使用例如根据设备规格不同的 APK。
【讨论】:
最好的方法(关于性能 + 质量)是使用 mipmap。
这意味着您从一个大的Texture(例如 1024*1024px)开始,然后将其缩小到其大小的四分之一,直到达到 1x1 图像。
所以你有一个 1024*1024、一个 512*512、一个 256*256... 和一个 1*1 Texture。
据我所知,您只需要提供最大的(上例中为 1024*1024)Texture 和 Libgdx 将在运行时创建 mipmap 链。
然后,底层的 OpenGL 会根据像素与 Texel 的比率来决定使用哪个 Texture。
看一下Texture API,好像有2个参数的构造函数,第一个参数是FileHandleTexture,第二个参数是boolean,表示,是否要使用mipmap 与否。
据我所知,您还必须设置正确的TextureFilter。
想知道TextureFilter对你有什么影响,我建议阅读this article。
【讨论】: