浅谈cocos2dx(17) 中单例管理模式

~~~~我的生活,我的点点滴滴!!

         首先明确一个问题,什么是管理者模式,管理类是用来管理一组相关对象的类,他提供了访问对象的接口,如果这么说比较抽象的话,我们来看下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项目就是一个单线程的,如果加载大量图片,大模块时会阻塞(这有多蛋疼) ,但是大家可以进入这个函数的声明中看,是线程安全的。

你可能感兴趣的:(浅谈cocos2dx(17) 中单例管理模式)