解决三星GT-s5831i 加载TexturePacker打包的图片文件会花屏的bug

来源:互联网 发布:矢量图库 知乎 编辑:程序博客网 时间:2024/04/30 13:38


游戏开发中后期,引入TexturePacker打包图片之后,就出现了这个问题。不过幸好公司这么多测试机,只有三星GT-s5831i 这一台会必现。

同时Elipse的logcat里面狂飙err:


之前一直忙其他更重要的bug,所以现在才腾出功夫来解决!

折腾了一个下午和一个晚上,终于成功定位并解决:

主要原因是有两个场景的打包图片搞得太大了,这个低端手机一加载这两个图片资源就内存不够了!

a.png 从2048*2048 降到 1024*2048,相当于从 16M 降到 8M

b.png 从1024*2048 降到 512*512,相当于从 8M 降到 1M


参考资料:

1.http://www.raywenderlich.com/32049/texture-packer-tutorial-how-to-create-and-optimize-sprite-sheets-in-cocos2d

Pixel Formats

So if you load an image in the default pixel format (RGBA888), you can calculate the memory it will take to store with the following calculation:

width x height x bytes per pixel = size in memory

In this case, you have a 512×512 image, so if you load it with the default pixel format it would be:

512 x 512 x 4 = 1MB (!)

2. Understanding pixel format in cocos2d v0.7.3

The texture’s pixel format is the way the image is stored in GPU memory.

Possible pixel formats:

  • RGBA8888 (32-bit) (kTexture2DPixelFormat_RGBA8888)
  • RGBA4444 (16-bit) (kTexture2DPixelFormat_RGBA4444)
  • RGB5_A1 (16-bit)(kTexture2DPixelFormat_RGB5A1)
  • RGB565 (16-bit) (kTexture2DPixelFormat_RGB565)

RGBA8888:

  • 8 bits are assigned to the red channel, 8 bits to the green channel, 8 bits to the blue channel and 8bits to the alpha channel.
  • Use this pixel format when you need the maximum possible quality for your image.
  • But it will consume the double of memory compared to 16-bit textures. Memory is a precious resource on the iPhone
  • Usually it is also slower to render.
  • Useful for: background image of your intro scene, and for images with lots of gradient colors

RGBA4444:

  • 4 bits are assigned to the red channel, 4 bits to the green channel, 4 bits to the blue channel, and 4bits to the alpha channel
  • It gives you good quality in all channels, good speed, good memory consumption.
  • Useful for: sprites that have different values of transparency

RGB5A1:

  • 5 bits are assigned to the red channel, 5 bits to the green channel, 5 bits to the blue channel, andonly 1 bit to the alpha channel
  • It gives you good quality in RGB channels but poor quality on the A channel. It also gives you good speed and good memory consumption.
  • Useful for: sprites that have transparent parts, but the transparency is either On or Off

RGB565:

  • 5 bits are assigned to the red channel, 6 bits to the green channel, and 5 bits to the blue channel. It has no alpha channel support
  • It gives you the best possible quality for 16-bit textures, but without alpha channel support.
  • Useful for: background images in your game.

The default pixel format in v0.7.3 is RGBA8888.

How to use it:

// Set the pixel format before loading the image// RGBA 8888 image (32-bit[Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA8888];Sprite *sprite1 = [Sprite spriteWithFile:@"test-rgba1.png"];// Set the pixel format before loading the image// RGBA 4444 image (16-bit)[Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGBA4444];Sprite *sprite2 = [Sprite spriteWithFile:@"test-rgba2.png"];// Set the pixel format before loading the image// RGB5A1 image (16-bit)[Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGB5A1];Sprite *sprite3 = [Sprite spriteWithFile:@"test-rgba3.png"];// Set the pixel format before loading the image// RGB565 image (16-bit)[Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_RGB565];Sprite *sprite4 = [Sprite spriteWithFile:@"test-rgba4.png"];// restore the default pixel format[Texture2D setDefaultAlphaPixelFormat:kTexture2DPixelFormat_Default];

FAQ:

  • Q: Can I use this technique for PVRTC images ?
  • A: No, PVRTC images have their own format. PVRTC images are faster and they consume less memory since they are either 2-bit or 4-bit textures but the quality is not that great.
  • Q: If I use 16-bit textures, will my game load faster ?
  • A: The texture pixel format has nothing to do with the loading times of your game. The Pixel Format is how the image is stored in the GPU memory. If you want faster loading times you should reduce the size of your .PNG/GIF/TIFF/TMP image file.
  • Q: Should I use RGB565 for the images that are compressed by XCode ?
  • A: When XCode compresses the PNG images, it will create a compressed PNG image that has it’s alpha channel premultiplied in the RGB channels. The PNG format is RGB565, but you should NOT confuse a PNG format with a texture pixel format. A PNG image is understood by Photoshop and cocos2d, but the GPU knows nothing about PNG images. The PNG images need to be converted into a Texture (the format understood by the GPU). The answer is: it depends on what you want. The Image (PNG,GIF,TIFF,BMP) format is independent of the Texture format.
  • Q: If I create a PNG/BMP/TIFF/GIF image without alpha channel, can I change the texture pixel format ?
  • A: If your PNG/BMP/TIFF/GIF image has no alpha channel (premultiplied or not), then the pixel format that will be used for the texture is RGB565. It can’t be changed using the API but you can change by modifying the Texture2D.m file
  • Q: Can I change the pixel format once the texture was created.
  • A: No. Once the Texture was created you can’t modify the pixel format. But you can create new textures from the same image using different pixel formats. Just remember to remove the image from the TextureMgr!

0 0
原创粉丝点击