Irrlicht 源码 学习笔记 【IUnknown】



【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 结束  //////////////////////////////////////////////// 



文章中有理解不到的地方

大家多提意见,多多指点吧!



  ( 最后发一张被人类征服的猫主子 )



你可能感兴趣的:(Irrlicht)