2.建立场景图形--1内存管理

提要

OSG快速入门指导 下载
重点:

  1. ref_ptr<> 对象接住— Reference对象本身
  2. ref_ptr<> 用来调用Reference::ref() 和 unref()
  3. ref_ptr<>之间传递引用对象,要传递真实指针 (可以调用ref_ptr<>::get传递)
类型传递说明
c++智能指针“auto_ptr<>=auto_ptr<>”
“智能指针=智能指针”
计数在智能指针中,因此必须通过这种赋值,才能将数字传递
ref_ptr<>指针“ref_ptr<>= Reference
“ref_ptr<>= ref_ptr<>::get()

“智能指针=真实指针”
计数在Reference上,所以需要传递对象指针,才能传递计数

一、内存管理

(一)保存根节点、间接引用子节点

    1. 程序保存一个指向根节点的指针 (程序进程只管root)
    1. 根节点直接or间接“引用”场景中所有图形节点 (root节点管理其他节点)
    1. 图解
      在这里插入图片描述

(二)计数引用

    1. 引用计数 reference count
    1. 计数组件 osg:Referenced + osg::ref_ptr<>
类名说明
osg:Referenced所有节点和场景图形均继承于此
osg:Referenced
/-CMyClass
osg::ref_ptr<>osg::ref_ptr<CMyClass> ptr = new CMyClass()
    1. 解释:
说明
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

内存管理演示:

  1. 赋值和传值
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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值