Cocos Studio制作的UI资源,可以用CSloader加载,他在加载的过程中是同步的,也就是必须把所有的图片资源加载完毕才会返回,如果图片资源很多很大,在手机上会造成比较长的卡顿。
为了解决这个问题,自然而然想到的就是改为异步,方法也比较简单,找到CSLoader里面加载图片资源的代码SpriteReader.cpp。
在这个类的setPropsWithFlatBuffers方法里面,有一个switch语句,当case 0 的时候加载图片资源。
可以看到代码如下:
sprite->setTexture(path);
同步加载图片就在这里了,将其修改为:
Director::getInstance()->getTextureCache()->addImageAsync(path, [=](Texture2D * texture){
sprite->setTexture(texture);
});
就能解决同步改异步的问题了。
实践过程中偶尔会报错,主要一个原因就是在这个异步加载过程中,sprite可能已经被销毁,为了防止报错,给sprite调用retain方法,避免销毁。改后的代码如下:
sprite->retain();
Director::getInstance()->getTextureCache()->addImageAsync(path, [=](Texture2D * texture){
sprite->setTexture(texture);
sprite->release();
});
自此,图片异步加载已经修改完毕。
最后的效果就是,面板可以瞬间生成,然后用户可以看到面板里面的图片一张一张的显示出来。
但在实践过程中,出现一个问题,那就是图片真的是一张一张的显示出来的,当图片比较多的情况下,面板完全显示的时间会比较长,就算图片有重用,重用的图片依然是一张一张的显示。
这个问题的原因出在TextureCache类里面,出门右转:TextureCache类的加载方式优化