浅谈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) 中单例管理模式的更多相关文章
- 浅谈:redis的主从复制 + 哨兵模式
浅谈:redis的主从复制 + 哨兵模式 主从模式 在谈论redis的主从复制之前,我们先回想下mysql的主从搭建过程,第一步呢首先要在主库服务器中修改my.cnf,开启一下bin_log功能, ...
- 浅谈cocos2dx(18) 中工厂模式
----我的生活.我的点点滴滴! ! cocos2d-x中也有工厂模式.何为工厂模式,顾名思义就是用来产生产品的,工厂就是用来创建其它类对象的类,我们把这个创建其它类对象的类叫做工厂类.而这些被创建的 ...
- 浅谈JavaScript中的内存管理
一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...
- 浅谈WCF的三种通信模式:请求响应模式、数据报模式和双工通讯模式
一: WCF的服务端与客户端在通信时有三种模式:请求响应模式.数据报模式和双工通讯模式. 说一下基本知识, 1.如果想要将当前接口作为wcf服务器,则一定要加上[ServiceContract] 契 ...
- 浅谈 JS 创建对象的 8 种模式
1.Object 模式 var o1 = {};//字面量的表现形式 var o2 = new Object; var o3 = new Object(); var o4 = new Object(n ...
- 好代码是管出来的——浅谈.Net Core的代码管理方法与落地(更新中...)
软件开发的目的是在规定成本和时间前提下,开发出具有适用性.有效性.可修改性.可靠性.可理解性.可维护性.可重用性.可移植性.可追踪性.可互操作性和满足用户需求的软件产品. 而对于整个开发过程来说,开发 ...
- 浅谈正则表达式-PHP为例
第一次比较系统的学习正则表达式,本篇文章以PHP语言为例来学习. 基本概念 正则表达式=普通字符(如a-z)+分隔符(正斜线(/).hash符号(#) 以及取反符号(~))+特殊字符(称为元字符) 两 ...
- 浅谈DAO工厂设计模式(工厂模式的好处)
随着软件分层设计的流行及广泛的应用,对于DAO的设计模式大家已经不再陌生了,DAO层已经在软件系统的开发中成为必不可少的一层,将后台的数据层和前台的VO进行分离.前段时间也针对于DAO的设计介绍过一个 ...
- 【Linux】浅谈段页式内存管理
让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存 ...
随机推荐
- [牛客网练习赛 45 F] Magic Slab 解题报告 (最大权闭合子图)
interlinkage: https://ac.nowcoder.com/acm/contest/847/F description: solution: 最大权闭合子图; 每个单元格看成一个正权点 ...
- C# WinForm DataGridView 给标题列增加序号及格式化某个字段
DataGridView 给标题列增加序号 private void dataGridView1_DataBindingComplete(object sender, DataGridViewBind ...
- 关于Html基础语法学习
晚上做完初赛,好像有点颓,就来学了学html,毕竟博客里面会用到嘛. 首先贴出我所学习的教程 http://www.w3school.com.cn/html/index.asp 我觉得吧,可能以我的记 ...
- Hadoop MapReduce编程 API入门系列之网页流量版本1(二十二)
不多说,直接上代码. 对流量原始日志进行流量统计,将不同省份的用户统计结果输出到不同文件. 代码 package zhouls.bigdata.myMapReduce.flowsum; import ...
- ansible usually
链接地址:https://my.oschina.net/kangvcar/blog/1830155
- JavaScript命名空间的理解与实现
命名空间有效防止函数名/类名和其他人的冲突,在使用多个第三方框架或类库的时候,一旦冲突,唯一能作的就是放弃其中一个.从事Web开发不可避免要接触JavaScript,目前最新版本的JavaScript ...
- 多线程之HttpClient
在程序用调用 Http 接口.请求 http 资源.编写 http 爬虫等的时候都需要在程序集中进行 Http 请求. 很多人习惯的 WebClient.HttpWebRequest 在 TPL 下很 ...
- 常用JQUERY插件大全
jQuery内容滚动插件-BoxSlider jQuery artDialog对话框插件 移动端日期选择组件 图像延迟加载库Echo.js 轮播图FlexSlider插件 Slick.js幻灯片使用方 ...
- vue中子组件需调用父组件通过异步获取的数据
原因:子组件需要调用父组件传过来的数据,如果这个数据是异步从接口里取的,那这个组件在任何生命周期里都取不到,而应该在接口调取后取到. 需要在msg拿到值后才调用组件,然后你在生命周期created里面 ...
- [ Java ] String 轉型 ArrayList
Lambda 對我而言一很像天書 這個行 Java code 讓我開始有點些微有 Lambda 感覺 https://stackoverflow.com/questions/10706721/conv ...