1. 程式人生 > >cocos2dx中載入圖片資源的方法,和從記憶體中獲取已經載入的圖片資源的方法 以及釋放問題

cocos2dx中載入圖片資源的方法,和從記憶體中獲取已經載入的圖片資源的方法 以及釋放問題

遊戲中通常需要將常用的資源如:聲音,圖片,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)

cocos2dx中圖片、聲音等快取 釋放在cocos2dx開發時,別人建議在首個場景中將聲音資源(SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic等),圖片資源等最好提前載入好(CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile等),在以後的場景中可以直接呼叫。請問在替換場景後,這些資源沒有被釋放嗎?


快取的資源是不會自動釋放的
但是你用快取建立的精靈,動畫,會在replease之後釋放掉
轉場景的時候可以用
紋理:removeUnuseTexture
紋理:removeUnusedSpriteFrames
動畫:removeArmatureFileInfo
聲音:unloadEffect之類的方法在記憶體中釋放掉

可以用getTextureCache():getCachedTextureInfo()檢視圖片的記憶體情況,返回值是string