---恢复内容开始---
在OpenGL中,绘制图像需要绑定纹理,绑定纹理的代价很高消耗很大。
试想,有1000张不同的小图片需要绘制,就需要绑定1000次。
把这1000张小图,打包成一张大图,绑定时一次就够了。参照SQL批处理来理解吧。
当然实际情况怎么打包,每关打一个包,UI打一个包等等这些我们不讨论。
文档地址:https://github.com/libgdx/libgdx/wiki/Texture-packer
libgdx内置了打包工具,命令是:
// OS X / Linux java -cp gdx.jar:extensions/gdx-tools/gdx-tools.jar com.badlogic.gdx.tools.texturepacker.TexturePacker inputDir [outputDir] [packFileName] // WINDOWS java -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/export export Packing....... 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, 90 10 orig: 90, 90 11 offset: 0, 0 12 index: -1 13 replay 14 rotate: false 15 xy: 2, 37 16 size: 148, 80 17 orig: 148, 80 18 offset: 0, 0 19 index: -1 20 startGame 21 rotate: false 22 xy: 2, 2 23 size: 99, 33 24 orig: 99, 33 25 offset: 0, 0 26 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 @Override 25 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 @Override 33 public void dispose() { 34 35 atlas.dispose(); 36 stage.dispose(); 37 super.dispose(); 38 } 39 40 @Override 41 public void resize(int width, int height) { 42 stage.getViewport().update(width,height); 43 super.resize(width, height); 44 } 45 }
上面代码中,game和menu分别是打包时的两个子文件夹。
时间: 2024-11-02 23:40:58