一、场景对象体系

二、场景对象生命周期管理

场景对象的生命周期,不适合采用原始的c++管理方式, 即由使用者自己负责删除。而应该采用引用计数方式, 自动负责删除。

采用引用计数方式, 目前用法比较广的分两类:

1、智能指针, 如boost::shared_ptr, 这种方式原理是基于c++对象的生命周期和析构函数来实现的, 而且引用计数是由智能指针对象保存的。在这种方式下, 对象的传递和引用都是使用智能指针对象, 例如:

 class A;
typedef boost::shared_ptr<A> TAPtr; //B需要保留对A的引用
class B
{
public:
void AccessA(TAPtr a)
{
m_a = a; //省略
}; private:
TAPtr m_a;
}; //C不需要保留对A的引用, 而仅仅是在某个接口中要访问A
class C
{
public:
void AccessA(TAPtr a)
{
//省略, 访问a
};
};

这种方式的优点:

使用者没有任何负担。

缺点:

[1] 效率低。

[2] 不方便暴露对象给lua使用。

2、cocos2d中的Ref方式, 即由对象自身来保存当前的引用数, 并且由对象的使用者自己来负责增加引用数retain和减少引用数release。 在这种方式下, 对象的传递和引用都是使用对象指针来实现, 例如:

 class A: public Ref;

 //B需要保留对A的引用
class B
{
public:
~B()
{
if(m_a)
{
m_a.release();
m_a = NULL;
}
} void AccessA(A *a)
{
m_a = a;
m_a.retain(); //省略
}; private:
A *m_a;
}; //C不需要保留对A的引用, 而仅仅是在某个接口中要访问A
class C
{
public:
void AccessA(A *a)
{
//省略, 访问a
};
};

这种方式的优点是:

[1] 效率高, 无论是传递、访问还是对于引用计数的操作(由使用者本身决定是否要调用retain和release)。

[2] 方便把对象暴露给Lua使用。

缺点是:

增 加了使用者自身的负担, 很容易造成内存泄露, 这正是因为由使用者本身决定是否要调用retain和release引起的。基于相同的原因, 如果要用容器(比如list, vector等)来保存对象时, 标准库中的容器没办法直接使用, 而必须封装, 或者在插入和删除元素是, 手动调用元素的retain和release.

ARPG客户端中场景对象体系设计的更多相关文章

  1. Python对象体系揭秘

    Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...

  2. 设计模式应用场景之Model设计中可以用到的设计模式

    在开发中,不同的场景适用不同的设计模式.对于开发建模方面,可以根据模型的抽象类型设计成简单属性模式和复杂组合模式. 因为组合模式中的属性为多种类型对象,可操作性也比较灵活. 而针对这种复杂数据结构,有 ...

  3. JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)

    1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...

  4. 理解SQL Server中的权限体系(下)----安全对象和权限

    原文:http://www.cnblogs.com/CareySon/archive/2012/04/12/SQL-Security-SecurableAndPermission.html 在开始阅读 ...

  5. 对象池在 .NET (Core)中的应用[2]: 设计篇

    <编程篇>已经涉及到了对象池模型的大部分核心接口和类型.对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注.总的来说,对象池模型由三个核心对象构成,它 ...

  6. Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战

    Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战 说明: Java生鲜系统中微服务的拆分应该如何架构设计与分析呢?以下是我的实战中的设计与经验分析. 目录 1. 微服务简介2. 当前现状3. ...

  7. JAVA中JavaBean对象之间属性拷贝的方法

    JAVA中JavaBean对象之间的拷贝通常是用get/set方法,但如果你有两个属性相同的JavaBean或有大部分属性相同的JavaBean,对于这种情况,可以采用以下几个简便方法处理. 下面对这 ...

  8. Discuz!NT中的Redis架构设计

    在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...

  9. C++中的对象初始化

    当对象在创建时获得了一个特定的值,我们说这个对象被初始化.初始化不是赋值,初始化的含义是创建变量赋予其一个初始值,而赋值的含义是把当前值擦除,而以一个新值来替代.对象初始化可以分为默认初始化.直接初始 ...

随机推荐

  1. OpenLayers学习记录(1)

    1.部署自己的服务器 首先下载openlayers的源码.解压后里面有很多内容.我们只需要拷贝目录下的OpenLayer.js.根目录下的lib目录.根目录下的img目录 theme目录 到你网站的o ...

  2. c语言中函数调用的本质从汇编角度分析

    今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...

  3. MyBatis的返回参数类型和查询结果遍历

    MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.result ...

  4. JAVA常用数据结构及原理分析

    JAVA常用数据结构及原理分析 http://www.2cto.com/kf/201506/412305.html 前不久面试官让我说一下怎么理解java数据结构框架,之前也看过部分源码,balaba ...

  5. C#大纲

    输入输出--数据类型--变量与常量--运算符表达式--语句(顺序.分支.循环)--数组--函数--结构体一.输入与输出.Console.ReadLine();Console.WriteLine();C ...

  6. (1)建立一个名叫Cat的类: 属性:姓名、毛色、年龄 行为:显示姓名、喊叫 (2)编写主类: 创建一个对象猫,姓名为“妮妮”,毛色为“灰色”,年龄为2岁,在屏幕上输 出该对象的毛色和年龄,让该对象调用显示姓名和喊叫两个方法。

    package lianxi; public class Cat { String Name, Color; int Age; void getName() { System.out.println( ...

  7. HTML-3月20日课堂总结

    1.图片热点 2.表单制作 3.课后作业 1.图片热点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  8. 各种编码中汉字所占字节数;中文字符集编码Unicode ,gb2312 , cp936 ,GBK,GB18030

    vim settings set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936,latin1set termencoding=utf-8se ...

  9. CentOS 7一些常用配置

    一.更改启动模式 背景:个人开发环境,安装了GNOME桌面,默认启动是图形化模式. 修改为命令行模式. systemctl set-default multi-user.target 二.命令行模式下 ...

  10. Java自制人机小游戏——————————剪刀、石头、布

    package com.hello.test; import java.util.Scanner; public class TestGame { public static void main(St ...