1, 2d game the most memory is undoubtedly the picture resources.
2, Cocos2d-x different platform to read the texture of different mechanisms. Under iOS using Cgimage,android and Windows is directly calling the PNG library. I tested, using the PNG library directly read PNG will save about 1MB more memory than cgimage (image occupies 4mb of memory) but the speed is one times slower than Cgimage. How time and space can be a choice depends on the actual situation. But the best option seems to be PVR (even if the Android version does not use PVRTC4).
3, in general, we can directly use the W * H * bpp to get a texture of the memory, such as a 1024*1024 format for argb8888, then he accounted for the memory is 1024*1024*4=4MB. Before seeing a blog that mentions JPG will open up 3 times times with this memory (converted to PNG first and then parse PNG), but the new iOS system does not seem to have this problem. JPG consumes almost the same amount of memory as PNG, and JPG parsing is faster (almost all 4MB parsing +4MB texture data, and JPG parsing time is half of PNG), but it's weird because JPG is no transparent color, a pixel up to 3 bytes, and png a pixel of 4 bytes, JPG textures should take up less memory, and later looked at the next cocos2d iOS loaded image code, which transforms all textures into rgba8888 format, so both JPG and PNG occupy 4 bytes. Because cocos2d support for other textures is not good enough, PVR will appear so efficient.
4, the PVR format can be recognized by the video card, and do not need to open up temporary memory to read, so even if the same as the argb8888 format of the picture, PVR will be more efficient than PNG, although it will not save the program stable running memory, but will avoid loading a large number of images when the memory spikes. And if it is an iOS device, you can use the PVRTC4 format image, which is equivalent to the DDS image under Windows, can be directly supported by the graphics card. It is lossy compression, a pixel only 4 bits, but if there is no gradient translucent color, the general effect is acceptable, and its savings in memory and CPU time is very significant.
5, PVR is not a balm. Although the PVR format can be used under Android devices, it is not possible to use PVRTC4, and it is not feasible to really reduce the memory of the game via PVR like on iOS devices.
6, Pvr.ccz is actually the PVR Picture Zip packaging, the program read the time or first extract the PVR resources, and then read the PVR. However, due to the compression can greatly reduce the volume of the picture, so although more understanding of the pressure process will not have a particularly large CPU consumption.
7, a JPG picture of the actual load process memory consumption, with a 1024*1024 argb8888 500k jpg Image for example: A. Read picture file (memory consumption, 500k) B, parse jpg data (cgimage, 4MB) C, Release 500k of image memory D, OpenGL texture data (4MB) e, release cgimage 4MB of memory. Note that this process is not necessarily sequential execution, freeing cgimage memory is actually a system-determined, and will be quick, but not necessarily immediate. So the memory will instantly soar around 9MB, then reduce 5MB, stabilize to about 4MB
The PNG picture is loaded with this same
PVR pictures can save the consumption of parsing the image data to the texture step. That is to read the PVR picture resources (equivalent to decompression PVR.CCZ to memory, if it is 1024*1024 argb8888 format, then the image size is 4mb,ccz compressed image around 1MB) consumption 4mb, the PVR picture data submitted to the graphics card consumption 4mb. Then release the file data 4mb. This seems to be not very advantageous compared to PNG's memory footprint. (Note that the PVR in this case refers to the argb8888 of the PVR package, which is vastly different from the performance of PVRTC4)
8, because the final consumption of memory are texture data, so long as the texture data format is certain, no matter what the format of the image is the same memory consumption. For example, using the PNG8 image, the volume will be reduced by 70%, but the memory consumption and PNG24/PNG32 is equivalent (when reading the palette will be restored to True color, that is, although the PNG8 is a pixel only 8 bits, but read into memory when the palette color will be restored, Still need to open up 1024*1024*4 bytes of space to store texture data). Of course there is no transparent color, cocos2d treatment or there is a difference. If there is no transparent color, you can use the PNG24, then the required texture space is 3MB.
Here is also a point to explain, generally we deal with the DDS texture under windows, we are accustomed to it by 2 of the whole power to it, although the picture content only 900*900, but the picture size is 1024*1024. The memory we use to read this image is 4MB, and a power of 2 will help improve the efficiency of the operation, but it is not very necessary. Both iOS and Android devices support textures that are not 2 full power. So if it's a PNG picture, then how big it is. The memory consumed at this time is only 900*900*4=3MB.
9, do not be too superstitious so-called removal of the alpha channel to save memory. This will also be a practical analysis of the specific results. I tested (using Cocos2d-x and the Wisp 3d engine respectively), and PNG images in rgba8888 and rgb888 format showed the same amount of memory consumed. 24-bit image Although the memory opened up when reading is only 3MB (1024*1024*3, note that if it is read with cgimage, that value is 4MB), but Glteximage2d submitted to the video card will still increase 4MB of memory. may be related to the data alignment of the video card.
Here I test there is a strange place, if the Npot picture with PVR, rgb888 than rgba8888 consumes less memory, but pot picture both are the same (PNG image two cases are the same). It is possible that the PowerVR graphics card has special handling.
10, rgb565 and rgb5551 's picture consumes the memory is half of rgba8888, if does not have the transparent gradient, the visual also does not see what difference. Some large background graphs can be preferred in this format.
11, PVR pictures load faster than PNG and JPG (same 1024*1024 argb8888), PNG consumption time may be about 700ms, but PVR only needs about 100ms. If it is PVR.CCZ compression, the time consumed is about 200ms. It is obvious that PVR has a great advantage in loading speed. This should be because PNG and JPG need to restore the image data to Rgba, but PVR can pass the image data directly to the graphics card. PVRTC4 images can be directly supported by the PowerVR graphics card.
Summary below:
1, the final decision to occupy the memory of the image is its pixel format and size, regardless of its extension. Png8 png32 jpg PVR as long as its pixel format is argb8888, then the final image occupies the same memory.
2, if not PVRTC4 format, then do not expand to 2 of the whole power, because the smaller the picture, the smaller the memory consumption
3, the removal of transparent channel alone will not reduce the memory consumed by the image, PNG and JPG images can not reduce the volume of the picture, so the rgb888 format is not recommended. Alternative options for rgb565 and rgb5551.
5, carefully load the image when the temporary opening of the texture data caused by high memory, you can consider to join the memory pool, timely opening up and release buffer.
6, if is to reduce the picture volume can choose: 1, the jpg--compression ratio is highest, the quality is good, but does not support translucent 2, png8--the same picture will be slightly larger than the JPG, uses the Imagealpha to convert, the visual almost does not see the difference. Both of these image formats can greatly reduce the volume of pictures (reducing 70%~80%), but do not help to reduce memory
7, if it is to reduce the memory can choose: 1, no transparent color picture unified conversion to rgb565 format, this time can not use PNG8, so png and PVR.CCZ picture size is almost the same, PVR.CCZ faster, so recommended PVR.CCZ rgb565 format 2, If the transparent color is just a key color callout, without a gradient blend, then the PVR.CCZ format of the recommended rgb5551 (R5_A1)
8, you can consider writing a packaging system, unified resource file packaging, rather than a single file with Pvr.ccz Zip compression, so that you can achieve higher efficiency. (for example, I encapsulated a blizzard of MPQ packaging, its reading speed and local file read speed, so that the best read efficiency)
Finally attached my test data log, the picture is a 1024*1024 picture, the actual picture content size is 960*700. Test device iphone4,png jpg and other picture loading code modified to Windows version. The back of Tex is the load time of the picture. The brackets behind the over are the memory consumed by the image loading.
[Plain]View PlainCopy
- 2012-12-27 14:28:54.614 hellocpp[4939:707] Cocos2d:surface size:960x640
- cocos2d:cocos2d:cocos2d-2.1beta3-x-2.1.0
- Cocos2d:cocos2d:GL_VENDOR:Imagination Technologies
- Cocos2d:cocos2d:GL_RENDERER:PowerVR SGX 535
- Cocos2d:cocos2d:GL_VERSION:OpenGL ES 2.0 imgsgx535-63.24
- cocos2d:cocos2d:gl_max_texture_size:2048
- Cocos2d:cocos2d:gl_max_texture_units:8
- Cocos2d:cocos2d:GL supports Pvrtc:yes
- Cocos2d:cocos2d:GL supports BGRA8888 Textures:no
- Cocos2d:cocos2d:GL supports Npot Textures:yes
- Cocos2d:cocos2d:GL supports Discard_framebuffer:yes
- Cocos2d:cocos2d:GL supports shareable Vao:yes
- Cocos2d:cocos2d:compiled with Profiling Support:no
- Tex 195 MAP_001_BG.PVR
- Map_001_bg.pvr
- ---over PROESS:11.0MB (4.0MB) FREE:274.6MB
- Tex 159 MAP_001_BG_RGB.PVR
- Map_001_bg_rgb.pvr
- ---over PROESS:15.0MB (4.0MB) FREE:270.6MB
- Tex 711 Map_001_bg.jpg
- Map_001_bg.jpg
- ---over PROESS:19.1MB (4.1MB) FREE:266.7MB
- Tex 653 Map_001_bg_rgb.jpg
- Map_001_bg_rgb.jpg
- ---over PROESS:23.1MB (4.0MB) FREE:262.6MB
- Tex 670 Map_001_bg.png
- Map_001_bg.png
- ---over PROESS:27.1MB (4.1MB) FREE:258.7MB
- Tex 739 Map_001_bg_rgb.png
- Map_001_bg_rgb.png
- ---over PROESS:31.1MB (4.0MB) FREE:254.3MB
- Tex-Map_001_BG.pvr.ccz
- Map_001_BG.pvr.ccz
- ---over PROESS:35.1MB (4.0MB) FREE:250.4MB
- Tex 204 MAP_001_BG_RGB.PVR.CCZ
- Map_001_BG_rgb.pvr.ccz
- ---over PROESS:39.2MB (4.0MB) FREE:246.5MB
- Tex-MAP_001_BG_RGB565.PVR
- Map_001_bg_rgb565.pvr
- ---over PROESS:41.2MB (2.0MB) FREE:244.6MB
- Tex 710 Map_001_bg_rgb565.png
- Map_001_bg_rgb565.png
- ---over PROESS:45.2MB (4.0MB) FREE:241.1MB
- Tex 591 Map_001_bg_rgba8888f.png
- Map_001_bg_rgba8888f.png
- ---over PROESS:47.8MB (2.6MB) FREE:238.3MB
- Tex 484 Map_001_bg_rgba8888f.jpg
- Map_001_bg_rgba8888f.jpg
- ---over PROESS:49.7MB (1.9MB) FREE:236.5MB
- Tex 123 MAP_001_BG_RGBA8888F.PVR
- Map_001_bg_rgba8888f.pvr
- ---over PROESS:52.4MB (2.7MB) FREE:234.1MB
- Tex 589 Map_001_bg_rgb888f.png
- Map_001_bg_rgb888f.png
- ---over PROESS:55.1MB (2.7MB) FREE:231.2MB
- Tex 478 Map_001_bg_rgb888f.jpg
- Map_001_bg_rgb888f.jpg
- ---over PROESS:57.0MB (1.9MB) FREE:229.4MB
- Tex-MAP_001_BG_RGB888F.PVR
- Map_001_bg_rgb888f.pvr
- ---over PROESS:59.0MB (2.0MB) FREE:227.8MB
- (LLDB)
The second log is the iOS version of the picture loaded, the other same as the previous, you can see faster than the Windows version of the PNG load faster, but the memory consumption is higher
[Plain]View PlainCopy
- 2012-12-27 15:36:10.330 hellocpp[4979:707] Cocos2d:surface size:960x640
- cocos2d:cocos2d:cocos2d-2.1beta3-x-2.1.0
- Cocos2d:cocos2d:GL_VENDOR:Imagination Technologies
- Cocos2d:cocos2d:GL_RENDERER:PowerVR SGX 535
- Cocos2d:cocos2d:GL_VERSION:OpenGL ES 2.0 imgsgx535-63.24
- cocos2d:cocos2d:gl_max_texture_size:2048
- Cocos2d:cocos2d:gl_max_texture_units:8
- Cocos2d:cocos2d:GL supports Pvrtc:yes
- Cocos2d:cocos2d:GL supports BGRA8888 Textures:no
- Cocos2d:cocos2d:GL supports Npot Textures:yes
- Cocos2d:cocos2d:GL supports Discard_framebuffer:yes
- Cocos2d:cocos2d:GL supports shareable Vao:yes
- Cocos2d:cocos2d:compiled with Profiling Support:no
- Tex 196 MAP_001_BG.PVR
- Map_001_bg.pvr
- ---over PROESS:11.0MB (4.0MB) FREE:275.8MB
- Tex-MAP_001_BG_RGB.PVR
- Map_001_bg_rgb.pvr
- ---over PROESS:15.0MB (4.0MB) FREE:271.9MB
- Tex-Map_001_bg.jpg
- Map_001_bg.jpg
- ---over PROESS:19.3MB (4.3MB) FREE:267.6MB
- Tex 151 Map_001_bg_rgb.jpg
- Map_001_bg_rgb.jpg
- ---over PROESS:23.5MB (4.2MB) FREE:263.8MB
- Tex 344 Map_001_bg.png
- Map_001_bg.png
- ---over PROESS:28.7MB (5.3MB) FREE:258.7MB
- Tex 328 Map_001_bg_rgb.png
- Map_001_bg_rgb.png
- ---over PROESS:34.0MB (5.3MB) FREE:253.6MB
- Tex 237 Map_001_BG.pvr.ccz
- Map_001_BG.pvr.ccz
- ---over PROESS:38.0MB (4.0MB) FREE:249.6MB
- Tex 221 Map_001_BG_rgb.pvr.ccz
- Map_001_BG_rgb.pvr.ccz
- ---over PROESS:42.0MB (4.0MB) FREE:245.2MB
- Tex 98 MAP_001_BG_RGB565.PVR
- Map_001_bg_rgb565.pvr
- ---over PROESS:44.0MB (2.0MB) FREE:243.2MB
- Tex Map_001_bg_rgb565.png
- Map_001_bg_rgb565.png
- ---over PROESS:48.9MB (4.9MB) FREE:238.2MB
- Tex 293 Map_001_bg_rgba8888f.png
- Map_001_bg_rgba8888f.png
- ---over PROESS:52.8MB (3.9MB) FREE:234.2MB
- Tex Map_001_bg_rgba8888f.jpg
- Map_001_bg_rgba8888f.jpg
- ---over PROESS:55.7MB (2.9MB) FREE:231.7MB
- Tex 143 MAP_001_BG_RGBA8888F.PVR
- Map_001_bg_rgba8888f.pvr
- ---over PROESS:58.3MB (2.7MB) FREE:228.8MB
- Tex Map_001_bg_rgb888f.png
- Map_001_bg_rgb888f.png
- ---over PROESS:62.2MB (3.9MB) FREE:225.3MB
- Tex Map_001_bg_rgb888f.jpg
- Map_001_bg_rgb888f.jpg
- ---over PROESS:65.1MB (2.9MB) FREE:222.7MB
- Tex-MAP_001_BG_RGB888F.PVR
- Map_001_bg_rgb888f.pvr
- ---over PROESS:67.0MB (1.9MB) FREE:220.7MB
- (LLDB)
iOS and Android game texture optimization and memory optimization (COCOS2D-X)