CCTextureCache类源码分析(4)

来源:互联网 发布:小型局域网网络搭建 编辑:程序博客网 时间:2024/06/11 20:26
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);

0 0