osg入门学习知识点记录一

osg入门学习知识点记录


为了学习osg,个人总结个人学习的内容,如果对各位有用,当然更好。如果没用,也只是自己记录,请勿喷。


1、先得有动机,当然大家都有。但是要怎么维持,我觉得,还是先把osg的环境给布置了。看到可以操作的内容然后就会有更进一步的学习的需求了。
如果第一步环境没有布置好,估计后面的学习都是纸上谈兵,无法操练更没有办法深入学习了。
所以,先布置好环境,最好是从编译源码布置环境入手。度过此阶段就更好继续下去了。
2、此后就看写例子,能运行就好,看源码。看了部分后,就发现,还是要专门补充一下。为了工作的开发的任务,虽然任务进度没有耽误,但是还是抽时间不断的学。
3、学习书籍的次序,现在觉得应该先看这本书:
《OpenSceneGraph_Quick_Start_Guide(中文)快速安装》及学习有地方又名:《OpenSceneGraph快速入门指导》,
第一章其中1.6节需要反复阅读,分别介绍了: 设计和体系、命名习惯,组件。
其中介绍:OSG 包含了一系列的开源图形库,主要为图形图像应用程序的开发提供场景管理和图形渲染优化的功能。它使用可移植的 ANSI C++编写,并使用已成为工业标准的 OpenGL 底层渲染 API。因此后面我还需要补充OpenGL的内容。


一些实用类:
Referenced:Referenced 类是所有场景图形节点和 OSG 的许多其它对象
的基类。它实现了一个用于跟踪内存使用情况的引用计数(reference
count) 。如果某个继承自 Referenced 的对象,其引用计数的数值到达 0,
那么系统将自动调用其析构函数并清理为此对象分配的内存。


ref_ptr<>:模板类 ref_ptr<>为其模板内容定义了一个智能指针,模板内
容必须继承自 Referenced 类(或提供一个与之相同的、能实现引用计数
的接口) 。当对象的地址分配给 ref_ptr<>时,对象的引用计数将自动增
加。同样,清除或者删去 ref_ptr 时,对象的引用计数将自动减少。


Object:纯虚类 Object 是 OSG 中一切需要 I/O 支持,拷贝和引用计数的
对象的基类。所有的节点类,以及某些 OSG 对象均派生自 Object 类。


Notify:osg 库提供了一系列控制调试,警告和错误输出的函数。用户可
以通过指定一个来自 NotifySeverity 枚举量的数值,设定输出的信息量。
OSG 中的大部分代码模块执行时都会显示相关的信息。


OSG 发行版包含了五个常用的 OSG 工具程序,它们对于调试和其它基于
OSG 的软件开发均十分有益。
? osgarchive:这个程序用于向.osga 文件包中添加新的文件。也可以用这
个程序实现包的分解和列表。
? osgconv:这个程序用于转换文件格式。尤其有用的是,它可以将任意文
件格式转换为经过优化的.ive 格式。
? osgdem: 这个程序用于将高程图等高度数据及图像数据转换为分页的地
形数据库。
? osgversion: 这个程序将当前 OSG 版本以及一些记录了 OSG 源代码改动
情况和贡献者信息送入 std::cout。
? osgviewer:这是一个灵活而强大的 OSG 场景及模型浏览器。1.3 节“运
行 osgviewer”详细说明了这个程序的实用方法。


OSG 的“废弃物”收集系统有以下两个组件:
? 通用的基类 osg::Referenced, 所有的 OSG 节点和场景图形均继承自这一
基类,它包含了一个整型的引用计数器。
? OSG 定义的智能指针模板类 ref_ptr<>。当代码中一个 Referenced 对象
指针赋予类型变量 ref_ptr<>时, Referenced 类的引用计数器会自动加 1。
如果程序要保存一个继承自 Referenced 的对象的指针,那么将指针保存在
ref_ptr<>中要好过使用标准 C++指针变量。如果代码中可以始终遵循这一原则,
那么当最后一个引用对象的 ref_ptr<>被弃用时,对象所占用的内存将自动释放。
当你创建任何继承自 Referenced 的场景图形节点或数据时, 你的应用程序不
可以直接释放其内存空间。 除了极少数例外, 几乎所有的 Referenced 派生类都声
明了保护析构函数。 这样可以保证, 继承自 Referenced 的对象只能够通过减少引
用计数器到 0 的方式来释放其内存。以下的文字将详细介绍 Referenced 类和
ref_ptr<>模板,并提供一些示例程序。




不要使用标准 C++指针变量来长时间地保存继承自 Referenced
类的对象指针。不过例外的是,如果指针最后还会保存在 ref_ptr<>
中, 那么你可以暂时地使用标准 C++指针变量。 不过, 使用 ref_ptr<>
仍旧是最安全的途径。




2.1.1 Referenced  类
Referenced 类(命名空间:osg)实现了对内存区段的引用计数器功能。所
有的 OSG 节点和场景图形数据,包括状态信息,顶点数组,法线,以及纹理坐
标,均派生自 Referenced 类。因此,所有的 OSG 场景图形均可以进行内存引用
计数。
Referenced 类包括了三个主要组成部分:
? 保护成员整型变量_refCount,用作引用计数,在构造时被初始化为 0。
? 公有函数 ref()和 unref(),用于实现_refCount 值的增加和减少。当
_refCount 为 0 时,unref()将自动释放该对象所占用的内存。
? 作为保护成员存在的虚析构函数。堆栈的创建和显示的析构均会因为析
构函数受保护而被禁止,而虚函数的特性将允许用户执行子类的析构函
数。
总体上来说, 用户的代码基本上不需要直接调用 ref()和 unref()函数, 只要使
用 ref_ptr<>进行处理即可。


2.1.2 ref_ptr<> 模板类
ref_ptr<>(命名空间:osg)用于实现一个指向 Referenced 对象的智能指针,
并对其引用计数器进行管理。当最后一个引用 Referenced 对象的 ref_ptr<>失去
作用时,对象将确保被释放。ref_ptr<>简化了场景图形内存释放的工作,并保证
当错误的调用堆栈展开时,对象也可以被正确释放。
ref_ptr<>模板类包括以下三个主要的组成部分:
? 一个私有指针_ptr,用于保存管理内存区域的地址。可以用 get()方法返
回_ptr 的值。
? 为了使 ref_ptr<>可以像正常的 C++指针一样工作, 重载或定义了一些方
法,如 operator->()和 operator=()。
? valid()方法用于判断 ref_ptr<>是否为空,不为 NULL 时返回 TRUE。当
程序将一个地址指定给 ref_ptr<>变量时, ref_ptr<>的重载函数 operator=()


将 会 假 定 此 地 址 指 向 一 个 Referenced 派 生 对 象 , 并 自 动 调 用
Referenced::ref(),将引用计数值自动加一。
ref_ptr<>变量的引用计数值减少的情形有这样两种:ref_ptr<>被释放(在类
的析构函数里执行减一) ,或者重新进行了赋值(在 operator=()里执行减一) 。在
以上两种情况中, ref_ptr<>都会通过调用 Referenced::unref()来执行减少引用计数
值的操作。


书籍中2.1.3 内存管理示例 对此部分的理解非常有益,应不时的多读几遍。
使用总结:
? 将派生自 Referenced 的对象赋予 ref_ptr<>变量,这一动作将自动调用
Referenced::ref()并使引用计数加一。
? 如果将 ref_ptr<>变量指向其它的对象,或者将其释放,那么将调用
Referenced::unref()方法, 使引用计数减一。 当计数器的值为 0 时, unref()
自动释放对象所占用的内存空间。
? 为新的 Referenced 对象开辟内存空间时,要尽量将其赋予 ref_ptr<>,以
保证 OSG 的内存管理工作正确。


请牢记,OSG 会在内部为每个长期保存的指针分配 ref_ptr<>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零点零一

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值