针对jpg格式的图片,我使用webp格式进行压缩,但是cocos引擎对图片纹理加载处理比较粗糙,统一按照RGBA8888进行处理的。导致jpg格式文件的内存占用增大了,因为jpg格式是没有alpha通道的,也按照RGBA8888处理就无端增大了内存。我直接加载一个jpg格式纹理,内存占用如下图:
看到这个LoginUI.jpg格式文件占用了2304K的内存,并且bpp为32(bpp为BitsPerPixelForFormat),所以针对这块我做了些优化,分别在同步和异步加载纹理的时候,进行g_defaultAlphaPixelFormat的设置,当加载png格式的时候使用RGBA8888,使用jpg格式的时候使用RGB888。优化后内存占用如下图:
经过优化,该jpg图片内存占用从2304K降低到1728K,降低了25%,效果不错。修改代码如下:
当然,对g_defaultAlphaPixelFormat进行了设置要记得还原。上面是同步加载纹理的时候进行的优化,在异步加载的时候,需要在addImageAsyncCallBack中进行上述优化,因为异步加载的过程是在子线程加载纹理,创建image及回调函数的一个结构体,然后在TextureCache::loadImage把这个结构体塞回到主线程的_asyncStructQueue队列里面,然后再在主线程中进行渲染相关处理,所以需要在回调到主线程之后进行上述优化处理,并且因为是在主线程,所以不用担心线程安全的问题。