将 Libgdx 和 TexturePacker 与 xxxdpi 图像一起使用会失真

Use Libgdx and TexturePacker with xxxdpi images get distorted

我是一名 android 开发人员,使用 LibGDX 构建我的第一款游戏。看了很多,还有一点不明白。

我意识到我应该有一组图像,最高分辨率 2560x1440(为了防止丑陋的放大而不是矢量图像)。

我正在使用 TexturePacker 来打包我的图像,甚至使用 linear linear 来获得最高质量:

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);

我已经按照几个 SO 中的建议将我的相机设置为固定仪表并避免所有 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 :( ,它使游戏像素化。我已经在具有多种分辨率的真实设备上对其进行了测试,它看起来很完美。

  1. 您在设置相机时犯了一个错误:您假设屏幕的纵横比始终相同,但实际上它会有所不同。最好选择一个恒定的高度或宽度(根据您制作的游戏类型选择)并根据当前屏幕的纵横比调整相反的尺寸。例如:

    mCamera.viewportHeight = 25.6f; //game screen always 25.6 meters tall

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

  2. "I should have one set of images for the highest resolution" 这不一定是真的。如果这样做,您将不得不在无法利用它们的设备上加载非常高分辨率的图像。这将使用大量内存并增加加载时间。在开发过程中可能没问题,但在未来您可能希望拥有两个或三个不同的较小分辨率版本,您可以有选择地加载这些版本。

    出于这个原因,我也会避免在您的代码中的任何地方对 100 进行硬编码。使 pixelsPerMeter 成为游戏启动时设置一次的变量。现在它只能是 100,但如果您决定稍后制作一些更小的分辨率艺术,您可以相应地调整它,而不必在您的代码中找到所有出现的 100。

  3. 您的最小过滤器应为 MipMapLinearLinearMipMapLinearNearest。否则,当绘制的精灵小于其原始分辨率时,性能会受到影响,并且可能看起来像您描述的那样扭曲。您可以查看 mip 映射以了解为什么会这样。