无论做什么游戏,都会遇到资源加载的问题,最近用到spine资源,那我把spine资源的几种加载方式说一说。spine资源包括一个atlas文件和一个json文件。
spine加载方式:
1、直接加载json文件和atlas文件,下面是代码部分,可想而知速度那是相当的慢,因为要在生成的时候读取json和atlas文件
SkeletonAnimation* SkeletonAnimation::createWithFile (const char* skeletonDataFile, const char* atlasFile, float scale) {
SkeletonAnimation* node = new SkeletonAnimation(skeletonDataFile, atlasFile, scale);
node->autorelease();
return node;
}
2、预加载spSkeletonData,通过spSkeletonData生成skeletonAnimaion,但是这个预加载也是很恐怖的,因为它不仅预加载的json文件,也预加载的atlas文件,就是说把图片也缓存了起来,这对于手机可怜的内存来说,是非常可怕的。
SkeletonAnimation* SkeletonAnimation::createWithData (spSkeletonData* skeletonData) {
SkeletonAnimation* node = new SkeletonAnimation(skeletonData);
node->autorelease();
return node;
}
3、预加载json文件,等需要用到的时候再加载atlas文件。
先把json文件缓存起来
//把得到的skeleton的Json添加到map容器中等待以后的使用
void SpineManager::AddToSkeletonJsonMap(std::string rNameString,const char* rFilename,float rScale)
{
char tJsonKey[256];
sprintf(tJsonKey,"%s.json", rFilename);
Json* root = spSkeletonJson_readSkeletonDataJsonFile(tJsonKey);
if (root!=NULL)
{
mpSkeletonJsonMap[rNameString].mJasonFile = root;
mpSkeletonJsonMap[rNameString].mFilePath = rFilename;
mpSkeletonJsonMap[rNameString].mScale = rScale;
}
else
{
log("we can not create %s skeleton",tJsonKey );
}
}
然后等需要的时候提取出来,并且生成spSkeletonData储存起来,等待备用
//把得到的skeletondata添加到map容器中等待以后的使用
void SpineManager::AddToSkeletonDataMap(std::string rNameString,const char* rFilename, void* rendererObject,float rScale,bool rAutoRelease)
{
spSkeletonData* pSkeletondata = NULL;
std::map::iterator iter2;
iter2 = mpSkeletonJsonMap.find(rNameString);
if(iter2!=mpSkeletonJsonMap.end())
{
pSkeletondata=this->CreateSkeletonData(iter2->second.mJasonFile,rFilename,rendererObject,rScale);
}
else
{
pSkeletondata=this->CreateSkeletonData(rFilename,rendererObject,rScale);
}
if (pSkeletondata)
{
mpSkeletonDataMap[rNameString].mSkeletonData = pSkeletondata;
mpSkeletonDataMap[rNameString].mIsAutoRelease = rAutoRelease;
}
else
{
log("we can not create %s skeleton",rNameString.c_str( ) );
}
}
在生成skeletonAnimation的时候,从容器中提取spSkeletonData*,用createWithData (spSkeletonData* skeletonData)方法生成skeletonAnimation,
这样可以很快的生成,并且也不会占用太多的内存空间。
引申
由加载spine资源我们可以理解;手机内存是非常有限的,所以不可能把所有的资源都加载到内存里面,但是为了游戏的流畅性,又必须事先把那些耗费IO的资源预先加载进来,这就要求我们做取舍。
像apine的json文件读取的时候很慢,但是 占用内存很小,这样我们就可以一次性把它都读取进来,储存起来,但是像图片文件是用到的时候再加载,注意,不是随用随加载。比如说某个场景中要用到,那么就在这个场景开始前把所有用到的图片资源加载进来,加载一次,多次使用,在场景结束后,释放资源。
如果游戏进行计算量比较大,生成的实体比较多,那么就要在场景开始前初始化所有的实体,千万不要等到用的时候才生成,那样一定会卡的,而且利用实体管理器,把需要剔除的实体回收到管理器中reset,等待下一次使用,所有生成的实体在场景结束后全部删除,释放资源。