在OpenGL中,纹理是不断被创建然后绘制,绑定纹理是相对昂贵的,所以将许多小图像统一存储在一张较大的图片上一次性绑定纹理,然后多次绘制它的一小部分。 libgdx有一个TexturePacker类,它是一个命令行应用程序,将许多较小的图像包装到较大的图像上。 它存储较小图像的位置,以便您可以使用TextureAtlas类在应用程序中轻松引用名称。
TexturePacker使用多个打包算法,但最重要的是基于最大矩形算法,然后选择最有效的结果。
Running TexturePacker
如果你更喜欢使用图形界面工具打包资源,请下载这个工具
TexturePacker类在gdx-tools项目中, 它可以通过Eclipse运行:
import com.badlogic.gdx.tools.texturepacker.TexturePacker;
public class MyPacker {
public static void main (String[] args) throws Exception {
TexturePacker.process(inputDir, outputDir, packFileName);
}
}
如果你使用Gradle构建,但是无法找到TexturePacker 类,请向你的 build.gradle中添加gdx-tools依赖支持.
如果对Gradle文件进行以下更新,也可以将texturePacker作为一个gradle任务运行。 首先,你需要更新你的build.gradle:
buildscript {
dependencies {
// ... other dependencies trimmed ...
classpath "com.badlogicgames.gdx:gdx-tools:$gdxVersion"
}
}
如果您想使用特定的版本,只需将$ gdxVersion变量替换为您选择的版本即可
// Store the parameters you want to pass the texturePacker here...
project.ext.texturePacker = [ "android/assets/input/path/", "android/assets/output/path/", "atlas_name" ]
// Import the texture packer
import com.badlogic.gdx.tools.texturepacker.TexturePacker
// Add a new task that packs the textures for you
task texturePacker << {
if (project.ext.has('texturePacker')) {
logger.info "Calling TexturePacker: "+texturePacker
TexturePacker.process(texturePacker[0], texturePacker[1], texturePacker[2])
}
}
TexturePacker可以一次打包一个应用程序的所有图像。 给定一个目录,它递归地扫描图像文件。 对于TexturePacker遇到的每个图像目录,它将图像统一打包成更大的纹理,称为页面(Page)。 如果目录中的图像在单个页面无法容纳下所有图像,则将使用多个页面(Page)。
最终,所有的图像将在一个或者多个Page页面上几种展现。如果所有图像都放在一个页面上,则不应该使用子目录,因为只有一个页面,应用程序将只执行一次纹理绑定,否则,可以使用子目录分隔相关图像进行纹理绑定。例如,应用程序可能希望将所有与游戏有关的图像放置在与菜单图像不同的目录中,这样单独涉及到菜单纹理的页面就无须加载跟游戏有关的纹理图像。