CCTextureCache类源码分析(4)
上面三篇分析了CCTextureCache如何加载纹理和缓存纹理,
这篇分析下CCTextureCache如何移除已经缓存的纹理。
我们缓存过的纹理,如果手动移除,是不会自动移除的。
1、
void removeAllTextures(); //移除所有纹理缓存
void CCTextureCache::removeAllTextures()
{
m_pTextures->removeAllObjects();
}
2、
/** Removes unused textures
* Textures that have a retain count of 1 will be deleted
* It is convenient to call this method after when starting a new Scene
* @since v0.8
*/
//移除不使用的纹理缓存,那什么是不使用的纹理缓存呢?
//引用计数为1的纹理,就是不使用的纹理缓存,那为什么说
//引用计数为1就是不使用的呢?上面三篇分析的过程中提到了
//缓存纹理的引用计数,在CCTextureCache纹理缓存中的纹理引用
//计数为1,如果这个纹理被一个精灵使用,则纹理的引用计数加1,
//当这个精灵不使用这个纹理时,那么会对纹理的引用计数减1,
//所以如果纹理的引用计数为1,则表明没有精灵引用这个纹理,所以
//就为不使用的纹理。
Textures that have a retain count of 1 will be deleted
void removeUnusedTextures();
void CCTextureCache::removeUnusedTextures()
{
/** Inter engineer zhuoshi sun finds that this way will get better performance
*/
if (m_pTextures->count())
{
// find elements to be removed
CCDictElement* pElement = NULL;
list<CCDictElement*> elementToRemove;
CCDICT_FOREACH(m_pTextures, pElement)
{
CCLOG("cocos2d: CCTextureCache: texture: %s", pElement->getStrKey());
CCTexture2D *value = (CCTexture2D*)pElement->getObject();
if (value->retainCount() == 1) //引用计数为1,则移除
{
elementToRemove.push_back(pElement);
}
}
// remove elements
for (list<CCDictElement*>::iterator iter = elementToRemove.begin(); iter != elementToRemove.end(); ++iter)
{
CCLOG("cocos2d: CCTextureCache: removing unused texture: %s", (*iter)->getStrKey());
m_pTextures->removeObjectForElememt(*iter);
}
}
}
3、根据纹理或纹理的key(纹理图片的全路径),这里我们可以直接使用
纹理图片的文件名。
/** Deletes a texture from the cache given a texture
*/
void removeTexture(CCTexture2D* texture);
/** Deletes a texture from the cache given a its key name
@since v0.99.4
*/
void removeTextureForKey(const char *textureKeyName);
CCTextureCache类源码分析(4)
最新推荐文章于 2018-04-11 15:33:10 发布