首页 > 代码库 > libgdx 图片打包 TexturePacker

libgdx 图片打包 TexturePacker

---恢复内容开始---

在OpenGL中,绘制图像需要绑定纹理,绑定纹理的代价很高消耗很大。

试想,有1000张不同的小图片需要绘制,就需要绑定1000次。

把这1000张小图,打包成一张大图,绑定时一次就够了。参照SQL批处理来理解吧。

当然实际情况怎么打包,每关打一个包,UI打一个包等等这些我们不讨论。

 

文档地址:https://github.com/libgdx/libgdx/wiki/Texture-packer

libgdx内置了打包工具,命令是:

// OS X / Linuxjava -cp gdx.jar:extensions/gdx-tools/gdx-tools.jar com.badlogic.gdx.tools.texturepacker.TexturePacker inputDir [outputDir] [packFileName]// WINDOWSjava -cp gdx.jar;extensions/gdx-tools/gdx-tools.jar com.badlogic.gdx.tools.texturepacker.TexturePacker inputDir [outputDir] [packFileName]

随便找几张小图,我们试一下

localhost:libgdx-1.3.1 HanHongmin$ java -cp gdx.jar:extensions/gdx-tools/gdx-tools.jar com.badlogic.gdx.tools.texturepacker.TexturePacker /Users/HanHongmin/Documents/exportexportPacking.......Writing 256x128: /Users/HanHongmin/Documents/export-packed/pack.png

只输入了一个inputDir 参数,默认生成了xxx-packed的文件夹,里面有张pack.png的大图,还有一个pack.atlas文件。

 1 pack.png 2 size: 242,117 3 format: RGBA8888 4 filter: Nearest,Nearest 5 repeat: none 6 backed 7   rotate: false 8   xy: 152, 27 9   size: 90, 9010   orig: 90, 9011   offset: 0, 012   index: -113 replay14   rotate: false15   xy: 2, 3716   size: 148, 8017   orig: 148, 8018   offset: 0, 019   index: -120 startGame21   rotate: false22   xy: 2, 223   size: 99, 3324   orig: 99, 3325   offset: 0, 026   index: -1

xy应该就是每张小图的其实位置,看起来是大图的左上角是(0,0)点。其他参数很好理解,不过不是很有必要读懂它。

这个还可以打包子文件夹!在inputDir参数的路径文件夹下建两个子文件夹,各方上几张图片试试。

文件夹中还可以放置pack.json来配置打包,查看文档吧!

 

使用打包的文件

 1 public class PackerTester extends ApplicationAdapter { 2     private Stage stage; 3     private TextureAtlas atlas; 4     private Texture packed; 5  6     @Override 7     public void create () { 8         Gdx.app.setLogLevel(Application.LOG_DEBUG); 9         stage = new Stage();10 11 12         atlas = new TextureAtlas(Gdx.files.internal("packedimages/pack.atlas"));13         TextureAtlas.AtlasRegion region = atlas.findRegion("menu/backed");//找出来是那张大图14         packed = region.getTexture();15         Image imgPacked = new Image(packed);16         imgPacked.setPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);17         stage.addActor(imgPacked);18         Sprite sprite = atlas.createSprite("game/backed");19         Image img = new Image(sprite);20         //NinePatch patch = atlas.createPatch("patchimagename");21         stage.addActor(img);22     }23 24     @Override25     public void render () {26         Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);27         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);28         stage.act();29         stage.draw();30     }31 32     @Override33     public void dispose() {34 35         atlas.dispose();36         stage.dispose();37         super.dispose();38     }39 40     @Override41     public void resize(int width, int height) {42         stage.getViewport().update(width,height);43         super.resize(width, height);44     }45 }

上面代码中,game和menu分别是打包时的两个子文件夹。

 

libgdx 图片打包 TexturePacker