spine资源加载

       无论做什么游戏,都会遇到资源加载的问题,最近用到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,等待下一次使用,所有生成的实体在场景结束后全部删除,释放资源。





你可能感兴趣的:(内存,游戏)