1

为了用精灵渲染清晰的图形,我决定为每个分辨率大小提供一个专用的精灵文件夹。我有55 个这样的文件夹,每个文件夹包含57 个.png文件(这意味着总数是 57*55 = 3135 个文件)。我将所有 55 个文件夹放入一个文件夹中,然后Texture Packer在该文件夹上运行。在输出文件夹中,我得到 1 个pack.atlas文件和 212 个 packX.png文件(X 从 1 运行到 212)

在我的代码中,我在我的Assets类中创建了这些字段

private static TextureAtlas atlas;
private static Sprite logo;
// ... total of 57 Sprite fields....

Assets而在游戏开始时调用的类的initialize方法中:

atlas = new TextureAtlas(Gdx.files.internal("pack.atlas"));
logo = atlas.createSprite(getWidthPath() + "logo");   //getWidthPath() returns the appropriate folder path based on the resolution size. As stated above, there are 55 such folder
//...atlas.createSprite 57 times for 57 fields....

我已经为较少数量的文件夹(3 个文件夹)完成了此操作,并且游戏运行良好。但是,当我决定支持所有 55 分辨率文件夹时,游戏无法在 Android 上加载,可以在桌面上加载,但一开始真的很慢。

那么pack.atlas文件引用的大量 Sprite 是否会导致挂起?

我想如果我只TexturePacker在每个分辨率文件夹上运行,我将得到 55pack.atlas个文件(而不是 1 个),每个pack.atlas文件现在将引用 57 个精灵(而不是 3135 个文件),游戏应该可以正常运行,但是太费力了

4

2 回答 2

2

正如@noone 所说,将所有不同分辨率大小的精灵打包成一个TextureAtlas会破坏图集的含义。我必须为每个决议打包一个地图集。但问题是如何自动完成?

在看到TexturePacker设置不允许这样做之后,最后我不得不TexturePacker稍微修改一下类的源代码并从这里的指令构建我自己的自定义 Libgdx 构建

我只是将main函数更改为接受另一个参数(true 或 false)来指定是否应该打包到输入文件夹的子文件夹中。这不是指定选项的传统方式,但对于我的情况来说已经足够了。

这是类中修改后的main函数TexturePacker.java

static public void main (String[] args) throws Exception {
    String input = null, output = null, packFileName = "pack.atlas";
    boolean optionSeparateFolder = false;

    switch (args.length) {
    case 4:
        packFileName = args[3];
    case 3:
        optionSeparateFolder = Boolean.parseBoolean(args[2]);
    case 2:
        output = args[1];
    case 1:
        input = args[0];
        break;
    default:
        System.out.println("Usage: inputDir [outputDir] [packToSeparateFolder] [packFileName]");
        System.exit(0);
    }
    File inputFile = new File(input);
    if (!optionSeparateFolder) {
        if (output == null) {
            output = new File(inputFile.getParentFile(), inputFile.getName() + "-packed").getAbsolutePath();
        }
        process(input, output, packFileName);
    }
    else{
        String[] childrenOfInput = inputFile.list();
        File outputFile = new File(output);
        for (int i=0; i<childrenOfInput.length; i++){
            process(inputFile.getAbsolutePath()+"/"+childrenOfInput[i],outputFile.getAbsolutePath()+"/"+childrenOfInput[i],packFileName);
        }
    }

}
于 2014-06-21T07:53:58.277 回答
1

我想如果我只TexturePacker在每个分辨率文件夹上运行,我将得到 55pack.atlas个文件(而不是 1 个),每个pack.atlas文件现在将引用 57 个精灵(而不是 3135 个文件),游戏应该可以正常运行,但是太费力了。

运行打包器 55 次太费力了,但是以 55 种不同的变体创建每个精灵不是吗?

你应该想出一种不同的方法,因为这个方法行不通。我假设您的地图集页面之一是 1024x1024。所以大约1MB。拥有 212 个这样的页面将导致 212MB 仅用于精灵。并且用户只会使用ONE这样的一组 sprite,导致主动使用 1MB,但仍然携带 211MB 无用的其他 sprite 组。

此外,通过不以任何理智的方式对资产进行分组(例如每个分辨率 1 个图集),您完全破坏了图集的目的。TextureAtlas用于减少降低性能的 OpenGL 纹理绑定的数量。但在您的情况下,生成的图集在这 212 页的任何地方都有所有需要的资产。这意味着在渲染时,由于有 212 个页面和分散的精灵,在幕后你仍然会有很多纹理绑定。

你可以看看Viewport。它可以帮助您处理不同的解决方案,并且实施了许多策略。您应该使用这种方法,而不是为每个可能的分辨率提供一组精灵。如果你想要为每个分辨率渲染像素完美的精灵,你仍然需要这 55 个不同的变体,但是你需要重新打包你的应用程序的 55 个版本,而不是在一个应用程序中打包 55 个版本。

于 2014-06-21T07:07:29.583 回答