游戏中通常需要将常用的资源如:声音,图片,plist文件,提前加载进内存,以加快游戏的流畅度
1.预加载声音:
SimpleAudioEngine::getInstance()->preloadBackgroundMusic("boom.mp3");
加载之后就可以直接播放:SimpleAudioEngine::getInstance()->playBackgroundMusic("boom.mp3");
2.预加载图片资源:
图片资源的加载分为同步加载和异步加载两种方式,通常我们采用异步加载的方式:
TextureCache::getInstance()->addImageAsync("boss.png", CC_CALLBACK_1(LoadingScene::ResourceCallBack,this));//ResourceCallBack是加载后调用的函数,可做统计用
加载到内存之后,我们就可以直接从内存读取,而不需要IO操作了:
从内存中读取已经加载的图片资源,有两种方法:
auto bg = Sprite::createWithTexture(TextureCache::getInstance()->getTextureForKey("groundLevel.jpg"));//前提是前面异步加载的图片资源必须加载完成了,成功了,因为异步加载只是执行了加载动作,是否加载成功,不得而知.
第二种方法:
auto bg = Sprite::createWithTexture(TextureCache::getInstance()->addImage("groundLevel.jpg"));//使用addImage()方法,最保险,如果该图片没有预先加载,则通过IO操作从磁盘中加载进内存,并返回一个Texture2D*对象,如果前面已经加载过,在内存中存在了,则直接读取内存.
两种方法的比较:
追求速度:第一种方法读取,前提是一定要保证要读取的资源图片已经加载进内存
追求保险:第二种方法,无论是否加载过,都会获得正确的结果,但是要保证资源图片是存在的.
3.加载其他资源文件,如plist,通常是一些3D模型的文件,或者粒子特效的资源文件
FileUtils::getInstance()->getDataFromFile("debris.plist");//预加载3D模型的文件
FileUtils::getInstance()->getDataFromFile("vanishingPoint.plist");//预加载漫天繁星的粒子特效的plist文件
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("menu_scene.plist");//预加载打包的图片plist文件
(从已经加载的内存帧缓存中读取图片的方法:auto sprite=Sprite::createWithSpriteFrameName("mainmenu_BG.png");//前提是mainmenu_BG.png是已经通过plist或其他方法加载到了FrameCache中)
原文:http://www.cnblogs.com/ttss/p/4136362.html
cocos2dx中图片、声音等缓存 释放在cocos2dx开发时,别人建议在首个场景中将声音资源(SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic等),图片资源等最好提前加载好(CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile等),在以后的场景中可以直接调用。请问在替换场景后,这些资源没有被释放吗?
缓存的资源是不会自动释放的
但是你用缓存创建的精灵,动画,会在replease之后释放掉
转场景的时候可以用
纹理:removeUnuseTexture
纹理:removeUnusedSpriteFrames
动画:removeArmatureFileInfo
声音:unloadEffect之类的方法在内存中释放掉
可以用getTextureCache():getCachedTextureInfo()查看图片的内存情况,返回值是string