Libgdx 当纹理中有太多精灵时,游戏将挂起
为了使用精灵渲染清晰的图形,我决定为每个分辨率大小提供一个专用的精灵文件夹。我有55个这样的文件夹,每个文件夹包含57个png文件(也就是说总数是57*55=3135个文件)。我将所有55个文件夹放在一个文件夹中,并在该文件夹上运行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
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中,请检查我的答案:)