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

本文详细解析了Cocos2d-x中的管理者模式,介绍了管理类的作用及其实现方式,通过具体示例展示了如何使用SpriteFrameCache、TextureCache和AnimationCache等管理类进行资源管理和缓存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值