Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Libgdx 当纹理中有太多精灵时,游戏将挂起_Libgdx_Texturepacker - Fatal编程技术网

Libgdx 当纹理中有太多精灵时,游戏将挂起

Libgdx 当纹理中有太多精灵时,游戏将挂起,libgdx,texturepacker,Libgdx,Texturepacker,为了使用精灵渲染清晰的图形,我决定为每个分辨率大小提供一个专用的精灵文件夹。我有55个这样的文件夹,每个文件夹包含57个png文件(也就是说总数是57*55=3135个文件)。我将所有55个文件夹放在一个文件夹中,并在该文件夹上运行Texture Packer。在输出文件夹中,我得到1个pack.atlas文件和212个packX.png文件(X从1到212运行) 在我的代码中,我在资产类中创建这些字段 private static TextureAtlas atlas; private sta

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

在我的代码中,我在
资产
类中创建这些字段

private static TextureAtlas atlas;
private static Sprite logo;
// ... total of 57 Sprite fields....
在游戏开始时调用的
资产
类的初始化方法中:

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
文件引用的大量精灵是否真的导致了挂起

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

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

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

你应该想出一个不同的方法,因为这个方法行不通。我猜你的地图册中有一页是1024x1024。所以大约1MB。如果有212个这样的页面,那么仅仅对于精灵来说,就会产生212MB。而且用户只会使用一组这样的精灵,因此主动使用1MB,但仍然携带211MB无用的其他精灵

此外,如果不以任何合理的方式对资产进行分组(如每种解决方案有一个atlas),则完全破坏了atlas的用途。
TextureAtlas
用于减少降低性能的OpenGL纹理绑定量。但在您的案例中,生成的atlas在这212页中的任何地方都有所需的资产。这意味着在渲染时,由于212页和分散的精灵,在场景后面仍然会有很多纹理绑定


你可以看看。它可以帮助您处理不同的解决方案,并且有许多策略可以实施。您应该使用这种方法,而不是为每个可能的分辨率提供一组精灵。如果你想对每个分辨率进行像素级完美的精灵渲染,你仍然需要55种不同的版本,但是你需要重新打包55个版本的应用程序,而不是像@noone所说的那样将55个版本打包在一个应用程序中,将不同分辨率大小的所有精灵打包为一个
TextureAtlas
会破坏地图集的意义。我必须为每个决议打包一个地图集。但问题是如何自动完成

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

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

下面是类
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);
        }
    }

}
static public void main(字符串[]args)引发异常{
字符串输入=null,输出=null,packFileName=“pack.atlas”;
布尔选项separatefolder=false;
开关(参数长度){
案例4:
packFileName=args[3];
案例3:
optionSeparateFolder=Boolean.parseBoolean(args[2]);
案例2:
输出=args[1];
案例1:
输入=参数[0];
打破
违约:
System.out.println(“用法:inputDir[outputDir][packtoseparetefolder][packFileName]”;
系统出口(0);
}
文件输入文件=新文件(输入);
如果(!选项分离文件夹){
if(输出==null){
输出=新文件(inputFile.getParentFile(),inputFile.getName()+“-packed”).getAbsolutePath();
}
过程(输入、输出、packFileName);
}
否则{
字符串[]childrenOfInput=inputFile.list();
文件输出文件=新文件(输出);

对于(int i=0;i1.我使用Illustrator创建我的精灵,并一次将它们导出到55个不同的版本中,所以这并不费劲。2.实际上,212页的大小只有5MB,当我知道它这么小时,我也感到惊讶,所以我认为它很好3.是的,现在我明白我不应该将所有内容都归为一个图集。4.我仍然想要pixe很好,我已经知道如何自动打包到55 atlas中,请检查我的答案:)