cocos2d纹理像素格式

发表于2015-10-10
评论0 1.5k浏览

纹理的像素格式是图像存储在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中默认的像素格式是RGBA8888。

cocos2d 2.1中,貌似默认支持的是16位颜色,需要在 AppDelegate.m中将 glView的pixelFormat从kEAGLColorFormatRGB565修改为:kEAGLColorFormatRGBA8。

使用方法:

ps.因为是翻译的,所以按照0.73版本的代码走,如果需要换成cocos2d2.x,轻将里面的Texture2D换成CCTexture2D,kTexture2Dxxx换成kCCTexture2Dxxx。Sprite换成CCSprite。

  1. // Set the pixel format before loading the image  
  2. // RGBA 8888 image (32-bit  
  3. [Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA8888];  
  4. Sprite *sprite1 = [Sprite spriteWithFile:@"test-rgba1.png"];  
  5.    
  6. // Set the pixel format before loading the image  
  7. // RGBA 4444 image (16-bit)  
  8. [Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA4444];  
  9. Sprite *sprite2 = [Sprite spriteWithFile:@"test-rgba2.png"];  
  10.    
  11. // Set the pixel format before loading the image  
  12. // RGB5A1 image (16-bit)  
  13. [Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGB5A1];  
  14. Sprite *sprite3 = [Sprite spriteWithFile:@"test-rgba3.png"];  
  15.    
  16. // Set the pixel format before loading the image  
  17. // RGB565 image (16-bit)  
  18. [Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGB565];  
  19. Sprite *sprite4 = [Sprite spriteWithFile:@"test-rgba4.png"];  
  20.    
  21. // restore the default pixel format  
  22. [Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_Default];  

  1. 问:我可以把这种技术使用在PVRTC图像上吗?
    答: 不行,PVRTC图像有自己的格式。PVRTC图像的速度更快,占用的内存更少。因为他们是2位或4位的纹理,但图片质量却并没那么好。
  2. 问:如果我用16位的纹理,我游戏载入速度是不是会更快呢?
    答: 纹理像素格式和你游戏的加载时间没半毛钱关系,像素格式用来管理图像在GPU内存中的存储方式。如果你想要更快的加载时间,你应该减少你.PNG /的GIF / TIFF / TMP图像文件的大小。
  3. 问:我应该使用XCode压缩过的RGB565图像吗?
    答: XCode压缩过的PNG图像有它自己的RGBA通道。即使PNG图像的格式是RGB565,你也不该混淆纹理像素格式和PNG图像格式。PNG图像的格式可以被Photoshop和cocos2d所识别,但GPU知道对其一无所知,而PNG图像最终需要转换成纹理(GPU所能理解的格式)。最终答案是:你究竟想要什么呢?你需要的是和图像格式(PNG,GIF TIFF,BMP)的无关的纹理格式!
  4. 问:如果我创建一个PNG / BMP / TIFF / GIF等图像没有alpha通道,我可以改变纹理像素格式?
    答:如果您的PNG / BMP / TIFF / GIF等图像没有alpha通道(或不预乘),那么纹理​​像素格式将被设置成RGB565。它是无法被API改变的,但你可以通过修改Texture2D.m文件来实现。
  5. 问:我可以一次性的修改已创建纹理的像素格式吗?
    答:没戏。一旦创建了纹理,你就不能修改纹理的像素格式啦!但是你可以从同一个图像创建不同格式的纹理。但是这之前千万别忘了从TextureMgr里面移除这个纹理(到了cocos2d 2.x的时候应该是CCTextureCache,这个cache会保存原来的纹理,所以如果创建同名纹理的时候,别忘记移除之前的那个)。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引