大佬教程收集整理的这篇文章主要介绍了cocos2dx异步加载资源制作Loading界面,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
要实现题目中的需求,网上的做法一般是使用pthread开一个新线程,在里面加载,然后主线程来管理进度条。
但是由于cocos2dx本身并不推荐使用多线程操作CCObject的retain(),release()和autorelease()方法,因为他的内存池不是线程安全的。
思考良久,我的做法是:
1,使用COcos2dx自带的addImageAsync()方法加载纹理(因为下一步要加载其它资源,而他们是需要纹理的,所以先加载纹理),并更新进度条
2,纹理加载完毕后,开始在主线程中使用定时器加载其它资源,如将资源加载到CCSpriteFrameCache或者CCAnimationCache中,同时更新进度条
3,要创建的对象们从cache中取得需要的资源
1,使用COcos2dx自带的addImageAsync()方法加载纹理(因为下一步要加载其它资源,而他们是需要纹理的,所以先加载纹理),并更新进度条
CCTextureCache::sharedTextureCache()->addImageAsync(imgPath1.c_str(),this,callfuncO_SELEctor(BattleLoading::cbLoadImg)); CCTextureCache::sharedTextureCache()->addImageAsync(imgPath2.c_str(),callfuncO_SELEctor(BattleLoading::cbLoadImg)); CCTextureCache::sharedTextureCache()->addImageAsync(imgPath3.c_str(),callfuncO_SELEctor(BattleLoading::cbLoadImg));
void BattleLoading::cbLoadImg(CCObject* sender) { numNowImg++; float percent = numNowImg/(num@R_719_10586@lImg+num@R_719_10586@lAnim); loadProgress->setPercentage(percent*barLength);//推动进度条 if (numNowImg==num@R_719_10586@lImg){ //如果纹理都加载完了,就启动计时器,每一帧都加载动画到动画缓存里,进入第二步 schedule(schedule_SELEctor(BattleLoading::loadAnimupdatE)); } }
void BattleLoading::loadAnimupdate(float dt) { addAnim(*m@R_719_10586@lIt); cbLoadAnim();//和上面的cbLoadImg()差不多 m@R_719_10586@lIt++;//这里利用std::list的迭代器来让动画在每一帧被读取 if(m@R_719_10586@lIt==m@R_719_10586@lList.end()) { unschedule(schedule_SELEctor(BattleLoading::loadAnimupdatE));//结束计时器 //读取完毕,进入战斗界面 FightStage* stage = FightStage::create(); CCScene* scene = CCScene::create(); scene->addChild(stagE); CCDirector::sharedDirector()->replaceScene(scenE); removeFromParent(); } }
这一步实际上是战斗界面中的各种东西的创建,比如一个士兵,create的时候就可以从刚才存入缓存的资源中取得自己需要的东西。
遗留问题:经过测试,可以有效地缩短战斗界面的创建时间,在我机器上,每一个士兵的创建时间从平均70ms降到平均15ms,但是,这么做仍然不能解决创建精灵时分配内存空间所产生的程序停顿(就是那剩下的15毫秒)。请路过的大神指点。
以上是大佬教程为你收集整理的cocos2dx异步加载资源制作Loading界面全部内容,希望文章能够帮你解决cocos2dx异步加载资源制作Loading界面所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。