提要
OSG快速入门指导 下载
重点:
- ref_ptr<> 对象接住— Reference对象本身
- ref_ptr<> 用来调用Reference::ref() 和 unref()
- ref_ptr<>之间传递引用对象,要传递真实指针 (可以调用ref_ptr<>::get传递)
类型 | 传递 | 说明 |
---|---|---|
c++智能指针 | “auto_ptr<>=auto_ptr<>” “智能指针=智能指针” | 计数在智能指针中,因此必须通过这种赋值,才能将数字传递 |
ref_ptr<>指针 | “ref_ptr<>= Reference ” “ref_ptr<>= ref_ptr<>::get()” “智能指针=真实指针” | 计数在Reference上,所以需要传递对象指针,才能传递计数 |
一、内存管理
(一)保存根节点、间接引用子节点
-
- 程序保存一个指向根节点的指针 (程序进程只管root)
-
- 根节点直接or间接“引用”场景中所有图形节点 (root节点管理其他节点)
-
- 图解
- 图解
(二)计数引用
-
- 引用计数 reference count
-
- 计数组件 osg:Referenced + osg::ref_ptr<>
类名 | 说明 |
---|---|
osg:Referenced | 所有节点和场景图形均继承于此 osg:Referenced /-CMyClass |
osg::ref_ptr<> | osg::ref_ptr<CMyClass> ptr = new CMyClass() |
-
- 解释:
类 | 说明 |
---|---|
osg:Referenced | .函数 1.ref() - Add Ref 2.unref()- Release Ref 变量: _refCount |
osg::ref_ptr<> | 去调用AddRef 和 ReleaseRef函数,用来设置对象加减引用 |
析构函数 | 所有派生于osg:Referenced的类,都要protected: ~CMyClass() 防止对象自动析构 |
(三) Reference类
提前:现有Reference 子类:OSG节点 、场景图形数据(状态信息,顶点数组、发现、纹理坐标)
Reference 三个组成部分
内容 | 说明 |
---|---|
protected: _refCount | .引用技术,开始为0 |
public: ref() unref() | 用于实现_refCount 的增加和减少。当减少为0是,自动释放内存 |
protected: ~析构函数() | 堆栈的创建、和显示析构都会被阻止 |
(四)ref_ptr<>模板类
前提:osg::ref_ptr<>,智能指针对Reference对象的_refCount进行增减。
内容 | 说明 | 其他 |
---|---|---|
private:_ptr | 用于保存管理内存的地址 | get()方法可以返回_ptr值 |
ref_ptr<> | 可以像正常的指针使用 | |
valid(ptr) | valid()函数可以检测 ref_ptr<>是否为空 | |
ref_ptr<>.operator=() | 赋值函数 | 可以将指针指向Reference的对象,并调用ref()函数,增加_refCount |
内存管理演示:
- 赋值和传值
void function1()
{
//1.创建新对象,赋值给ref_ptr<>
osg::ref_ptr<Geode> geode = new Geode(); // 此时引用值 = 1
//2.Group对象增加子节点
grp->addChild(geode.get()); // 此时引用值 = 2;
}
解释:
geode 指针对象因为出了{} ,所以析构,引用值-1
最后Geode的对象被保存在grp,引用值=1
重点:
传递时,是使用真是指针,因为数字是集成在reference对象本身,所以必须传真实指针
2.总结:
a Reference赋值给ref_ptr<>对象,则调用Reference::ref()
b ref_ptr<>对象如果析构,则Reference::unref()