~~~~我的生活,我的点点滴滴!。
首先明白一个问题。什么是管理者模式,管理类是用来管理一组相关对象的类,他提供了訪问对象的接口,假设这么说比較抽象的话。我们来看下cocos2dx中都有哪些类是管理类你就会非常明白了,比如TextureCache, SpriteFrameCache, AnimationCache,这些类都是管理类。
就拿SpriteFrame来说。这个类管理了对象spriteframe,我们通过提供一个键来获得相应的值。像AnimationCache,TextureCache不都是这样吗,用一个键来获取相应的值。
所以这些类都叫做管理类。由于他们管理着一组相关的对象。之所以使用管理者模式一个是由于为訪问相关对象提供了统一的接口。还有一个就是缓存游戏用到的资源,提高游戏的性能,以上的三个类不正是这种作用吗,下面是实现这个模式的代码。
#ifndef _MANAGER_PATTERN_H_ #define _MANAGER_PATTERN_H_ #include "cocos2d.h" USING_NS_CC; class ManagerPattern { public: static ManagerPattern * getInstance() { if(m_manager == NULL) { m_manager = new ManagerPattern(); m_dictionary = new Dictionary(); m_dictionary->retain(); } return m_manager; }; static void freeInstance() { CC_SAFE_DELETE(m_manager); CC_SAFE_RELEASE_NULL(m_dictionary); }; void registeInstance(const std::string& key,CCObject *obj) { m_dictionary->setObject(obj,key); }; CCObject* getObject(const std::string& key) { return m_dictionary->objectForKey(key); }; private: static ManagerPattern * m_manager; static Dictionary * m_dictionary; }; ManagerPattern * ManagerPattern::m_manager = NULL; Dictionary *ManagerPattern::m_dictionary = NULL;
以上的管理者类使用了单例。内部有一个Dictionary。用来以键值对的方式存储我们的对象,訪问的时候通过一个键,返回相应的对象值,在cocos中我们仅仅须要明确那些缓存类事实上就是管理者模式就能够了。我们创建SpriteFrameCache的时候之所以提供了一个plist文件就是由于它要使用这个文件的信息来创建对象。然后依据sprite的名称来返回创建好的对象。我觉得在cocos中使用管理者模式最重要的就是提高了效率,提前缓存了我们使用的资源。
//几个管理类的使用方法。初始化都是通过键值对的方式。而获取对象则是传入一个键 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("1.plist"); auto spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("test"); auto callback = [](Ref *){}; TextureCache::getInstance()->addImageAsync("test.png",callback); auto texture2d = TextureCache::getInstance()->getTextureForKey("test.png"); AnimationCache::getInstance()->addAnimation(Animation::create(),"test"); AnimationCache::getInstance()->getAnimation("test");
上面看那个addImageAsync() 是异步载入,可是听人说在2.x 1.x的时候,整个cocos项目就是一个单线程的。假设载入大量图片,大模块时会堵塞(这有多蛋疼) ,可是大家能够进入这个函数的声明中看,是线程安全的。