为了节省资源,我们通常将很多的小png合成一张然后配合图片的pList信息(使用TexturePicker)可以节约内存资源,
可以看到 ,SpriteFrameCache使用了CCTextureCache,将图片添加到了纹理缓存中
CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("test.plist", "test.png");
进入到该方法内部可以看到:
void CCSpriteFrameCache::addSpriteFramesWithFile(const char* plist, const char* textureFileName)
{
CCAssert(textureFileName, "texture name should not be null");
CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage(textureFileName);
if (texture)
{
addSpriteFramesWithFile(plist, texture);
}
else
{
CCLOG("cocos2d: CCSpriteFrameCache: couldn't load texture file. File not found %s", textureFileName);
}
}
可以看到 ,SpriteFrameCache使用了CCTextureCache,将图片添加到了纹理缓存中
在其中的addSpriteFrameWithFile中,cocos2d会去解析这个pList,然后遍历pList,根据pList的信息,来创建CCSpriteFrame,以 CCDictionary* m_pSpriteFrames;来保存这写信息,spriteFrame中存储有该贴图引用(大图),以及贴图的位置。
所以我们在使用的时候可以通过
CCSprite *player = CCSprite::createWithSpriteFrameName("*.png");//会在shareFrameCache中取得这个frame
这种方式来取得一个sprite,这种方式的本质还是
CCSprite* CCSprite::createWithTexture(CCTexture2D *pTexture,const CCRect& rect)
通过这种方式来创建一张图片
所以真正缓存的并不是CCSprite而是SpriteFrame和一个Texture