使用Libgdx和TexturePacker处理xdpi图像会出现失真问题

7
我是一名安卓开发者,正在使用LibGDX构建我的第一个游戏。经过大量阅读,仍有一件事我不明白。我意识到我应该有一套图片,针对最高分辨率2560x1440(为了避免丑陋的向上缩放而不是矢量图像)。我使用TexturePacker打包我的图片,甚至使用线性线性获取最大质量:
TexturePacker.Settings settings = new TexturePacker.Settings();
settings.filterMin = Texture.TextureFilter.Linear;
settings.filterMag = Texture.TextureFilter.Linear;
settings.maxWidth = 4096;
settings.maxHeight = 2048;
TexturePacker.process(settings, inputDir, outputDir, packFileName);

我已经按照几个stackoverflow上的建议,将相机设置为固定米数并避免使用PPM。从Screen的C'TOR中可以看到:

mCamera = new OrthographicCamera();
mCamera.viewportWidth = 25.6f; ; // 2560 / 100
mCamera.viewportHeight = 14.4f ; // 1440 / 100
mCamera.position.set(mCamera.viewportWidth / 2, mCamera.viewportHeight / 2, 0f);
mCamera.update();

正如您所看到的,我选择将1米=100像素。

那么,这意味着我应该使用1/100的尺寸来绘制我的精灵,我正在这里进行:

TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("images/pack.atlas"));
mImage = atlas.createSprite("image"));
mImage.setSize(mImage.getWidth() / 100 , mImage.getHeight() / 100);

这个方法可以使用,图片也能按预期显示。但是它们非常失真!一个完美的圆形图像在边缘处看起来像素化且不圆。

所以,我的问题是:
  1. 这是最佳实践吗?还是我应该采用不同的方法?
  2. 只使用最高质量的图像是正确的吗?
  3. 失真是否意味着我的代码真的在缩小精灵,而libgdx又将其放大并损坏了质量?
谢谢!
编辑
我将根据@Tenfour04的答案调整(1)和(2)。 关于(3),问题出在Genymotion上:(,它会使游戏像素化。我已经在几种分辨率的真实设备上进行了测试,效果很完美。

你好,我现在正在使用纹理打包器,遇到了相同的问题,圆形图像边缘看起来有锯齿,不是圆形的。你能找到解决方案吗? - isJulian00
1个回答

1
  1. 您在设置相机时有一个错误:您假设屏幕始终具有相同的宽高比,但实际上它会变化。更好的方法是选择一个固定的高度或宽度(根据您正在制作的游戏类型选择),并根据当前屏幕的宽高比调整另一个维度。例如:

    mCamera.viewportHeight = 25.6f; // 游戏屏幕始终为 25.6 米高

    mCamera.viewportWidth = 25.6f / (float)Gdx.graphics.getHeight() * (float)Gdx.graphics.getWidth();

  2. "我应该为最高分辨率准备一组图像" 这不一定是正确的。如果这样做,您将不得不在无法利用它们的设备上加载非常高分辨率的图像。这将使用大量内存并增加加载时间。在开发过程中可能没问题,但到后面您可能需要有两个或三个不同的较小分辨率版本,可以有选择性地加载。

    出于这个原因,我也会避免在代码中硬编码那个 100。将 pixelsPerMeter 设置为一个变量,在游戏启动时设置一次。现在它可以是 100,但如果您决定稍后制作一些较小分辨率的艺术品,那么可以相应地进行调整,而无需查找代码中所有出现 100 的位置。

  3. 您的 min filter 应该是 MipMapLinearLinearMipMapLinearNearest。否则,在精灵绘制为其本机分辨率以下时,性能将受到影响,并且可能会像您所描述的那样看起来扭曲。您可以查找 mip mapping 以了解原因。


嗨,感谢您提供详细的答案。(1)我熟悉这个并且当然会实现它,谢谢。(2)听起来很聪明,使用TexturePacker很容易做到,为什么我没有看到任何教程提到这种工作方法呢?(3)我也尝试了MipMapLinearLinear和其他选项,但精灵仍然失真。所以,从您的话中可以看出,我可能还有其他问题? - Shirane85
不知道为什么很多教程都没有提到这个。TexturePacker中有支持。也许可以发布一个扭曲精灵的图片。不确定还有什么原因会导致你所描述的问题。 - Tenfour04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接