1.png 單個png的情況比較少
2.plist和png一起的打包資源
3.plist和pvr.ccz一起的打包資源
4.CocosStudio導出的.ExportJson後綴的動畫文件
再重複一遍加載機制:所有的資源是按序加載的,不可同時加載多個文件。執行異步加載的處理肯定是寫在void update(float f)中,做到按幀加載。
1.png的異步加載
1
2
|
Director::getInstance()->getTextureCache()->addImageAsync(reloadImages[curReloadImgNum], CC_CALLBACK_1(LoadingScene::imageAsyncCallback, this )); |
2.plist和png一起的打包資源
廢話不多,直接上方法,沒有加載plist的api,我們使用如1的方法加載png,然後在回調函數中加載plist。
1
2
|
Director::getInstance()->getTextureCache()->addImageAsync(reloadPlists[curReloadPlistNum]+ "png" , CC_CALLBACK_1(LoadingScene::plistImageAsyncCallback, this )); |
注意回調函數的參數,這是plist異步加載的關鍵,形參是png紋理。
1
2
3
4
5
6
|
void LoadingScene::plistImageAsyncCallback(cocos2d::Texture2D*
texture) { SpriteFrameCache::getInstance()->addSpriteFramesWithFile(reloadPlists[curReloadPlistNum].append( "plist" ),
texture); curReloadPlistNum++; loading
= true ; } |
3.plist和pvr.ccz一起的打包資源
類似2的方法。
1
2
3
4
5
6
7
8
|
Director::getInstance()->getTextureCache()->addImageAsync(reloadPvrPlists[curReloadPvrPlistNum]
+ "pvr.ccz" , CC_CALLBACK_1(LoadingScene::pvrPlistImageAsyncCallback, this )); void LoadingScene::pvrPlistImageAsyncCallback(cocos2d::Texture2D*
texture) { SpriteFrameCache::getInstance()->addSpriteFramesWithFile(reloadPvrPlists[curReloadPvrPlistNum].append( "plist" ),
texture); curReloadPvrPlistNum++; loading
= true ; } |
4.CocosStudio導出的.ExportJson後綴的動畫文件
1
2
3
4
5
6
7
|
ArmatureDataManager::getInstance()->addArmatureFileInfoAsync(reloadExportJsons[curReloadExportJsonNum], this ,
schedule_selector(LoadingScene::jsonAsyncCallback)); void LoadingScene::jsonAsyncCallback( float f) { curReloadExportJsonNum++; loading
= true ; } |
四種加載方法已經介紹完了,只要在update中做好按序加載就可以了。
如何優化內存,加載儘量少的資源?
我的這個場景叫LoadingScene,這是一箇中轉場景,既是切換兩個場景之間的過渡場景,用來釋放上一個場景的資源和預加載下一個場景資源。
在這個場景中,我們可以釋放掉cache中的所有文件,然後根據下個場景的內容來加載所需的文件。
還有一個小技巧關於異步加載exportJson的文件。這個異步加載,既可以加載動畫緩存,還可以把跟它一起的plist和png一起加載到緩存中,所有如果想加載plist,也可以把它們到成靜止的動畫,然後使用exportJson加載即可使用裏面的精靈。