1.纹理缓存的使用(TextureCache)
纹理缓存时cocos2dx中较为底层且常用的缓存,通过提前将纹理图片等等资源加载进内存方便之后调用。比如有些游戏在不同场景的切换过程中可能会有一个读条的场景,这个场景中通常就是将上一个场景中的不用的图片从纹理缓存中清楚掉并加载下一个场景中所需要用到的纹理资源到纹理缓存当中。
1.1 添加纹理图片到纹理缓存中
1 cocos2d::TextureCache* texturecache = Director::getInstance()->getTextureCache();//纹理缓存是全局共享的一个单例,要使用首先要获得其指针 2 const char file_path[100] = "D:\\image.png"; 3 texturecache->addImage(file_path);//将图片读取到纹理缓存当中
但当我们要加载较多第纹理资源的时候,这个时候就不能使用addImage方法去添加,否则会阻塞主线程使帧率降低甚至降到零,此时应该使用addImageAsync方法,具体实现如下
1 std::vector<std::string> filename;//用于保存每一张纹理资源的路径 2 getfilename(filename);//将需要加载的纹理图片的路径放入数组中\ 3 cocos2d::TextureCache* texturecache = Director::getInstance()->getTextureCache(); 4 size_t picturenum=0;//用于观察加载完成了多少图片 5 for(auto i : filename) { 6 texturecache -> addImageAsync(i, [&](Texture2D*){ 7 cocos2d::log(std::to_string(++picturenum).c_str()); 8 };//函数的第一个参数是文件路径,第二个参数是一个参数为Texture2D*的函数,在该图片加载完成后执行 9 }; 10 cocos2d::log("线程已全部启动“);
执行上述代码后我们可以在日志输出中看到日志先打印了“线程已全部启动”,然后开始逐个打印1,2,3.......。此时主线程并不会被阻塞,依旧在不断的监听事件,重绘场景。
1.2 从纹理缓存中提取纹理图片
1 cocos2d::TextureCache* texturecache = Director::getInstance()->getTextureCache(); 2 cocos2d::Texture2D* texture = texturecache->getTextureForKey(filename);//使用加入缓存时的文件名来提取纹理