一开始感觉比较乱,后来查找了一些资料,整理了一下才感觉清晰了一些,一般我们都会涉及到加载图片,在游戏中需要加载大量的纹理图片,这些操作时很耗内存和资源的。
TextureCache(纹理缓存):用于加载和管理纹理。一旦纹理加载完成,下次使用时可使用它返回之前加载的纹理,从而减少对GPU和CPU内存的占用
(1)当你创建一个精灵,你一般会使用Sprite::create(pszFileName)。假如你去看Sprite::create(pszFileName)的实现方式,你将看到它将这个图片增加到纹理缓存中去了,可以看一下进去create方法看一下源码,简单来说,cocos2d-x会自动帮你缓存texture。
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
一旦这个纹理被加载了,在下一时刻就会返回之前加载的纹理引用,并且减少加载的时候瞬间增加的内存
关于缓存的清理:
removeUnusedTextures则会释放当前所有引用计数为1的纹理,即目前没有被使用的纹理。比如新场景创建好后,使用此方法释放没有使用的纹理非常方便。
Director::getInstance()->getTextureCache()->removeUnusedTextures();
当没有其它对象(比如sprite)持有纹理的引用的时候,纹理仍然会存在内存之间。基于这一点,我们可以立马从缓存中移除出去,这样,当纹理不存需要的时候,马上就会从内存中释放掉。如下代码所示:
Director::getInstance()->getTextureCache()->removeTextureForKey("Images/grossinis_sister2.png");
当收到"Memory Warning"时,可以调用removeAllTextures()方法。在短期内: 它还将释放一些资源,防止您的应用程序被杀害; 中期: 它将分配更多的资源;从长远来看:它会是相同的。
Director::getInstance()->getTextureCache()->removeAllTextures();
(2)如果文件名以前没有被加载时,它会创建一个新的Texture2D 对象,它会返回它。它将使用文件名作为key否则,它会返回一个引用先前加载的图像。
TextureCache屏蔽了加载纹理的许多细节;
addImage函数会返回一个纹理Texture2D的引用,可能是新加载到内存的,也可能是之前已经存在的
SPriteFrameCache(精灵帧缓存):简单来说就是它缓存的是一张集合了很多小图片的纹理,他一般都是加载Plist文件到缓存中,这个的话就是要自己来缓存,一般都是缓存好,然后直接从缓存中取得。
注:把多个帧动画合成一张,然后生成plist文件,plist文件记载着每一帧在大图中的位置信息
如果你看到那些加载图片的东西你就可以进去看一下是加载哪种缓存的!
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ui.plist");
auto background = Sprite::createWithSpriteFrameName("background.png");
CCAnimationCache(动画缓存):这次动画缓存需要我们手动维护全部动画信息。也因为加载帧动画完全是代码操作的,目前还没有配置文件指导,所以不能像另外两个缓存那样透明化
http://blog.youkuaiyun.com/CHENPOLU/article/details/19434449 (cocos2d-x中的缓存)
好了,说完上面的几种缓存方式,其实创建动画有三种方式:
生成动画有两种方式:第一种是通过动画帧plist文件,另一种使用精灵帧缓存生成帧数组创建动画.
http://cocos2d.9tech.cn/news/2014/0303/39946.html (Cocos2dx帧动画的两种创建方式)