【IUnknown】
IUnknown是Irrlicht中绝大多数的对象基类
下面翻译Irrlicht中对IUnknown的一段注释 ( 纯本人翻译,水平不高,选择性略过 ヾ(。 ̄_ ̄)ツ。。 )
/////////////////////////////////////////////// 翻译 buff 开始///////////////////////////////////////////////
IUnknown是鬼火引擎中大多数类的基类
该类通过 grad() 和 drop() 两个方法提供引用计数机制
并且可以为每一个对象存储一个用于调试的字符串
由于鬼火引擎中大多数类衍生自IUnknown接口,所以它们拥有引用计数机制
当你在Irrlicht中使用一个以"create"开头的方法创建一个对象时
一个对象被创建出来,并且你会获得一个指向该新对象的指针
当你不再需要这个对象的时候, 你必须调用 drop() 方法
如果 grab() 方法没有在其它地方调用,这将销毁这个对象
如果 grab() 方法在其他地方调用过,就不会销毁该对象,因为其他地方可能依然需要该对象
注意:如果你已经通过一个以"create"开头的方法创建了该对象,则(在需要释放的时候)只需要调用 drop() 方法
/////////////////////////////////////////////// 翻译 buff 结束 ///////////////////////////////////////////////
该类实现了 引用计数 机制 并维护一个 DebugName
因为还没有读过引擎的其它部分
所以对于DebugName我只能从字面上理解为是一个用于调试的信息
用的时候大概要酱婶儿用 :
#ifndef _DEBUG
object->setDebugName("^_^");
#endif
具体的用法以后在代码里面看到再回来补充吧!
关于引用计数装置大家应该已经比较熟悉了
(辣么简单,性价比辣么高, 比如cocos2dx,Python, Ruby都用的它)
引用计数就是使用一个变量记录当前对象被引用的次数
每次引用该对象时,对其引用计数 +1
不需要再使用时,对其引用计数 -1 , 而不是直接 delete 或 free
每次对其引用计数进行 -1 操作时检查引用计数是否 >0
因为不为 0 的时候说明他还是有人需要用的,所以还要留住小命
当引用计数为 0 时,自感无用, 痛觉不爱, 自绝经脉!
cocos2dx里操作引用计数机制的方法名字是分别 retain() 和 release()
Irrlicht 里面使用的方法名字分别为 grab() 和 drop()
但也只是名字不同,内容还是同一套
先看下 IUnknown 中除去 DebugName 之后纯粹引用计数的代码
class IUnknown
{
public:
//! Constructor.
IUnknown() : ReferenceCounter(1) { }
//! Destructor.
virtual ~IUnknown() { }
void grab()
{
++ReferenceCounter;
}
bool drop()
{
--ReferenceCounter;
if (!ReferenceCounter)
{
delete this;
return true;
}
return false;
}
private:
s32 ReferenceCounter;
};
由代码可见
当实例被创建出来的时候 ReferenceCounter 是 1
表示创建出来就已经有一个引用了 ( 没用的话造出来干啥? )
然后每次类似赋值或者传参操作的时候
就把自己当前对象的指针(地址)交出去
然后调用 grab() 方法对引用计数 +1 ( 表示多了一个 爱自己 的人 )
每次释放只需要调用 drop() 对引用计数 -1 ( 表示少了一个爱你的人)
drop() 方法每次对计数 -1 之后会检查计数, 如果计数为 0 ,会使用 delete this 这种方式 "自缢"
IUnknown 是Irrlicht中大多数类的基类
为自己的子子孙孙提供了引用计数的基因
虽然引用计数这个内存管理方法是很简单很实用的
但要想用出它的威力还是需要一些练习的
//////////////////////////////////////////////// 废话 buff 开启 ////////////////////////////////////////////////
比如本人第一次使用的时候
那是在2016年的秋天
风中掺杂着落叶
一个少年在"阴暗"的宿舍里
孤独地对着十四寸的电脑屏幕面容憔悴...
直到第二次用之前,他的内心深处都是拒绝的...
但事实证明,是当时我太年轻啦~
//////////////////////////////////////////////// 废话 buff 结束 ////////////////////////////////////////////////
文章中有理解不到的地方
大家多提意见,多多指点吧!
( 最后发一张被人类征服的猫主子 )