译自:Understanding pixel format in cocos2d v0.7.3
纹理的像素格式是图像存储在GPU内存的方式。
你可能会见到以下像素格式:
- RGBA8888(32位)(kTexture2DPixelFormat_RGBA8888)
- RGBA4444(16位)(kTexture2DPixelFormat_RGBA4444)
- RGB5_A1(16位)(kTexture2DPixelFormat_RGB5A1)
- RGB565(16位)(kTexture2DPixelFormat_RGB565)
RGBA8888:
红色通道、绿色通道、蓝色通道和alpha 通道各8位。
如果想获得最好的图片质量,使用这种格式是很靠谱的。
但它会占用的内存会比16位的纹理多一倍,在IPhone上内存是很宝贵的资源,这个你懂的。
自然的,它的运算速度也是相对较慢的。
常用的地方:整个场景的背景图片、大量渐变色的图片。
RGBA4444:
红色通道、绿色通道、蓝色通道、alpha通道各4位
它对每个通道都有不错的支持,还能保证相对良好的速度和内存占用率。
常用的地方:需要有不同的透明度精灵。
RGB5A1:
红、绿、蓝三色通道各5位,Alpha通道仅有1位。
RGB通道表现良好,但是Alpha通道可就惨了。它在内存占用和速度上表现不错。
常用的地方:精灵需要透明度上的表现,但是透明度的表现上只有两种:开或者关。
RGB565:
红色通道5位,绿色通道6位,蓝色通道5位,这可怜的孩子没有Alpha通道。
它能尽最大努力的给你一个高品质的16位纹理,前提是你不需要透明度的支持。
常用的地方:游戏中的背景图像。
cocos2d-x中默认的像素格式是RGBA8888。
cocos2d 2.1中,貌似默认支持的是16位颜色,需要在 AppDelegate.m中将 glView的pixelFormat从kEAGLColorFormatRGB565修改为:kEAGLColorFormatRGBA8。
使用方法:
ps.因为是翻译的,所以按照0.73版本的代码走,如果需要换成cocos2d2.x,轻将里面的Texture2D换成CCTexture2D,kTexture2Dxxx换成kCCTexture2Dxxx。Sprite换成CCSprite。
- 问:我可以把这种技术使用在PVRTC图像上吗?
答: 不行,PVRTC图像有自己的格式。PVRTC图像的速度更快,占用的内存更少。因为他们是2位或4位的纹理,但图片质量却并没那么好。 - 问:如果我用16位的纹理,我游戏载入速度是不是会更快呢?
答: 纹理像素格式和你游戏的加载时间没半毛钱关系,像素格式用来管理图像在GPU内存中的存储方式。如果你想要更快的加载时间,你应该减少你.PNG /的GIF / TIFF / TMP图像文件的大小。 - 问:我应该使用XCode压缩过的RGB565图像吗?
答: XCode压缩过的PNG图像有它自己的RGBA通道。即使PNG图像的格式是RGB565,你也不该混淆纹理像素格式和PNG图像格式。PNG图像的格式可以被Photoshop和cocos2d所识别,但GPU知道对其一无所知,而PNG图像最终需要转换成纹理(GPU所能理解的格式)。最终答案是:你究竟想要什么呢?你需要的是和图像格式(PNG,GIF TIFF,BMP)的无关的纹理格式! - 问:如果我创建一个PNG / BMP / TIFF / GIF等图像没有alpha通道,我可以改变纹理像素格式?
答:如果您的PNG / BMP / TIFF / GIF等图像没有alpha通道(或不预乘),那么纹理像素格式将被设置成RGB565。它是无法被API改变的,但你可以通过修改Texture2D.m文件来实现。 - 问:我可以一次性的修改已创建纹理的像素格式吗? 答:没戏。一旦创建了纹理,你就不能修改纹理的像素格式啦!但是你可以从同一个图像创建不同格式的纹理。但是这之前千万别忘了从TextureMgr里面移除这个纹理(到了cocos2d 2.x的时候应该是CCTextureCache,这个cache会保存原来的纹理,所以如果创建同名纹理的时候,别忘记移除之前的那个)。