(三)OSG初学者入门基础教程

这篇博客详细介绍了OpenSceneGraph(OSG)中的超级指针机制,用于解决资源的智能管理和内存释放问题。文章通过卡车和箱子的场景解释了超级指针的必要性,指出OSG使用osg::ref_ptr<>模板实现自动引用计数。同时,文章通过代码示例展示了如何安全和不安全地使用超级指针,并讨论了内存泄漏的风险。最后,博客还涉及了使用超级指针进行模型的移动、旋转和缩放操作。
摘要由CSDN通过智能技术生成

20.超级指针(难点

关于超级指针的问题由来已久,用的颇广。在 OSG 中问题是这样提出来的,有这样一个场景,有一辆卡车, 卡车上有一个箱子。如果说卡车在运行过程中,箱子突然掉了,这样就知道该把箱子的结点删除。那么如 果说还有一个箱子,在地上放着,从感觉上来讲他们应该用同一块内存。卡车上的箱子虽然掉了,但是地 上的箱子还在,所以箱子所占的资源不能被粗鲁的释放掉。

这样就引用了超级指针的机制,其实就是引用一个计数器,这个计数器会计算这个箱子被引用的次数,被 别人引用一次这个计数器增加一,别人不用一次,即:释放一次,则计数器减一。当减至 0 时,内存放掉 不用。

 

21.超级指针详解 (难点

内容来自  OpenSceneGraph基本渲染理论

Leandro Motta Barros

Start: August 17th 02005

译:FreeSouth

让我们来以一个定义开讲:一个 资源 必须在它被使用之前被申请,而在它使用之后不久被释放,也许我们有很多的应用程

序在使用同一片资源,一个不需要了而另一个却还需要使用这片资源。这两种情况都涉及到页面(在打开前必须处于关闭状态)

和数据的移动(在移动前可能被加锁或做一些包裹处理)。在 OpenGL 当中,也同样有一些关于申请与释放资源的例子(一个示例是纹理函数的名称被命名为 glGenTextures(), 它就必须被函数 glDeleteTextures()释放)。

在事物扩展的事例当中,事物拥有者使用 AllocateTing()来分配该事物, 然后拥有者便有责任来管理他们的分配与释放操作。

在 OSG 当中,有一些稍微有些复杂的细节来实现这些操作,也就是一些事物可能有多个拥有者。比如,在场景图 1.7 所示当中,

类 osg::geode 中含有 box 绑定到两个父结点身上,到底哪个负责他们的分配与释放操作呢。

在这种情况之下,只要还有一个引用指向该资源,该资源就不应该被释放。所以,大多数的 OSG 对象都有一个内部的计数

器用来计算有多少个指针指向它。当没有指针指向该资源(同样,可以称做对象)时,它的计数器会变为 0,当计算器为 0 时就

可以放掉对象。

幸运的是,我们程序员不需要手工的来维护这些引用计数:这就是超级指针为什么存在的原因。在 OSG 当中超级指针被一

个称为 osg::ref_ptr<>的类模版来实现。无论在什么时候,只要该对象被引用,则在 osg::ref_ptr<>当中的计数器会自动增加, 通过这种方式实现了资源的自动管理,当不需要使用它时,它会在不久后释放,在申请它时会自动分配空间。

 

22.超级指针代码解释

下面这个例子会示例如何使用 OSG 的超级指针,例子中有一些代码如下所示:

SmartPointers.cpp

1 #include <cstdlib>

2 #include <iostream>

3 #include <osg/Geode>

4 #include <osg/Group>

5

6 void MayThrow()

7 {

8 if (rand() % 2)

9 throw "Aaaargh!";

10 }

11

12 int main()

13 {

14 try

15 {

16 srand(time(0));

17 osg::ref_ptr<osg::Group> group (new osg::Group());

18

19 // This is OK, albeit a li

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值