博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈cocos2dx(17) 中单例管理模式
阅读量:7041 次
发布时间:2019-06-28

本文共 2171 字,大约阅读时间需要 7 分钟。

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

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

转载于:https://www.cnblogs.com/yutingliuyl/p/6905961.html

你可能感兴趣的文章
Elastic Search学习笔记3——集群配置
查看>>
Unity客户端资源智能管理
查看>>
SVN在Windows下的安装配置步骤
查看>>
网页两侧悬浮广告js代码
查看>>
算法练习:判断一个字符串中的字符是否唯一(只用基本数据结构)
查看>>
淘宝技术的科普贴图文
查看>>
http://itunes.apple.com/lookup?id=获取不到版本
查看>>
理解Javascript的状态容器Redux
查看>>
制作liveusb实现ubuntserver12全自动无人职守安装
查看>>
centos7的fstab要小心
查看>>
Windows phone8 基础篇(三)常用控件(二)
查看>>
架构师速成4.8-幼儿园书单资料推荐
查看>>
MySQL-Proxy实现读写分离部署文档
查看>>
For Update
查看>>
Hyper-V 之03 创建iSCSI存储和故障转移群集
查看>>
如何成为一名架构师?
查看>>
我的友情链接
查看>>
nfs failed, reason given by server: Permission denied的离奇解决
查看>>
2018 1.21测试
查看>>
DFS与BFS对比
查看>>