代码改变世界

游戏开发中的利器TexturePacker实现游戏贴图打包

2012-01-07 15:37  张智清  阅读(9871)  评论(0编辑  收藏  举报

著名的图片打包软件TexturePacker,只要是做游戏应用开发,几乎都会或多或少的用到它。

使用TexturePacker更多的性能优势在于手游上,因为无论Android或者ios系统使用的是OpenGL ES来渲染,所以我们要针对OpenGL ES来进行优化。
第一点:内存方面OpenGL ES纹理要求宽和高都是2n次幂的倍数。就是说,若start.png这张图片本身是480X320的话,那它在载入内存后其实是一张512X512的纹理。那它具体占用了多少内存呢?默认情况下,当在Cocos2D里加载一张图片时,对于每一个像素点使用4个字节(1个byte即8bit)来表示——分别代表red\green\blue\alpha透明通道,简称RGBA8888。这样的话,这张start.png图片在使用默认像素格式下所占内存为:512*512*4=1MB。所以我们可以考虑将小的图片拼成到大的图片,然后一起加载。

第二点:渲染速度方面OpenGL ES要求尽量减少渲染时切换纹理和glDrawArray的呼叫,所以将图片拼成大图片,这样就减少了纹理的切换。所以使用TexturePacker是很有必要的。

TexturePacker所支持的游戏引擎更是相当广泛,主要有:
Cocos2d-iPhone
Corona(TM) SDK - Cross-platform game development framework
Gideros - Cross-platform game development framework
Sparrow - iPhone
LibGDX - Java (Android + Desktop)
LimeJS - JavaScript/HTML5 framework
Ogre with CEGUI - 3D gaming framework and GUI
Moal - Multiplatform gaming framework
CSS Sprites
JSON / HTML5
......

TextturePacker的界面的一些设置项:

Data Format:导出什么引擎数据,默认cocos2d,下拉列表中有很多,基本常用的引擎都支持了 
Data File :导出文件位置(后缀名.plist) Texture Format:纹理格式,默认png 
Image format:图片像素格式,默认RGBA8888...根据对图片质量的需求导出不同的格式
Dithering:抖动,默认NearestNeighbour,(如果图像上面有许许多多的“条条”和颜色梯度变化)将其修改成FloydSteinberg+Alpha; 
Scale: 让你可以保存一个比原始图片尺寸要大一点、或者小一点的spritesheet。比如,如果你想在spritesheet中加载“@2x"的图片(也即为Retina-display设备或者ipad创建的)。但是你同时也想为不支持高清显示的iphone和touch制作spritesheet,这时候只需要设置scale为 1.0,同时勾选autoSD就可以了。也就是说,只需要美工提供高清显示的图片,用这个软件可以自己为你生成高清和普清的图片。 
Algorithm TexturePacker:里面目前唯一支持的算法就是MaxRects,即按精灵尺寸大小排列,但是这个算法效果非常好,因此你不用管它。 
Border/shape padding: 即在spritesheet里面,设置精灵与精灵之间的间隔。如果你在你的游戏当中看到精灵的旁边有一些“杂图”的时候,你就可以增加这个精灵之间的间隔。 
Extrude: 精灵边界的重复像素个数. 这个与间隔是相对应的--如果你在你的精灵的边边上看到一些透明的小点点,你就可以通过把这个值设设置大一点。 
Trim: 通过移除精灵四周的透明区域使之更好地放在spritesheet中去。不要担心,这些透明的区域仅仅是为了使spritesheet里面的精灵紧凑一点。--当你从cocos2d里面去读取这些精灵的时候,这些透明区域仍然在寻里。(因为,有些情况下,你可能需要这些信息来确定精灵的位置) 
Shape outlines: 把这个选项打开,那么就能看到精灵的边边。这在调试的时候非常有用。 
AddSprite:添加图片
Add Folder:根据文件夹添加图片 
Publish:导出资源文件(.plist和png)