文件中的索引进行读取。 13
硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现
(2)加载子节点:如果场景蹄选器选出的是新节点,并且节点和文件数据没有在内存
中,将会添加一个数据请求来记录信息,然后由后台的线程来加载。
(3)预编译数据:加载进动态数据库的文件如果需要预编译的话,可以提前进行预编
译来提高效率。之前先送入等待编译队列。
(4)合并到场景树中:之前准备好的对象会放入等待合并队列,由
addLoadedDataToSceneGraph函数来把带有文件数据的子节点addchild到对应的 父节点。
弃胸象P人 释放该节点以
选:巧漏國, >列 ,〉低系统开销
数据请求队 尝试_—??
I/????.? =o 列 ■=>加载节点的文件 _
加载后,需要提前^、等待编译队 ^、执行对象的预编 编译的数据 >列 ‘ ^译T作
编译完毕,或者不 等待合并队 . -
1——
图 3-1 DatabasePager 的主要[作
Fig.3-1 The Main Work Of The DatabasePager
在上图的原理中,对象离视点太远也算作是离幵“当前页面”。左边代表提供的数据,
送到中间白色方块的相应队列中,右边代表得到的最终的操作和结果。由后台线程
DatabaseThread来处理的是用浅色方块表示的,由其他函数来处理的是用深色方块来表 示的。 15
口制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现
第三章基于OGRE的DatabasePager技术的研究与实现
OGRE在海量模型数据处理能力方面比较不足,只能以资源组的形式统一的加载和
卸载场景中的数据,也就是说当前场景中的数据必须先加载到内存中,使用时从内存中
直接调用,不使用时统一进行卸载,不能很高效的对内存中的数据进行管理,也不能很
有效的对单个模型数据进行处理。所以使用起来比较臃肿,不是很灵活。而DatabasePager
动态数据库技术能很好的解决这个问题,这个技术在OSG中有着很好的应用,而本论
文主要是考虑如何将它应用到OGRE当中去。由于这一章的重点是模型的动态加载卸
载,还没有详细介绍PagedLOD技术,本章中用的PagedLOD节点都只有一个子节点,
只考虑该子节点的加载卸载,不考虑其他细节层次。而下一章将对PagedLOD技术的应
用进行详细讲解。
3.1 DatabasePager 原理
3.1.1 DatabasePager动态数据库简介
DatabasePager动态数据库是伴随着海量数据,育而生的。所谓动态,大致意思可以
总结为一句话,就是需要的数据加载进内存,不需要的数据从内存卸载出去。不过看似
简单的一句话,细节实现起来还需要考虑很多的问题,比如怎样加载卸载才能不影响主
程序的运行,怎样能保证需要的数据恰好在数据库中,怎样判断哪些是不用的数据,并
且悄悄的卸载掉,这些都是需要仔细的思考和研究的。
3.1.2 DatabasePager 的主要工作
DatabasePager的主要工作可以分为以下几个部分:
(1)删除模型数据:在场景更新的过程中,如果当前场景中的模型超过规定数量或者
超过规定时间规定顿数,将会对模型节点进行删除,把文件数据信息从内存释放。
这样进行删除判断能有一定的缓冲机制是非常好的,如果一旦不使用就删除的话
会比较麻烦,因为有些数据虽然暂时不用,但是马上可能又需要,再重新加载的
话得不偿失。 14
日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现
序中将要用到的资源文件先放置在资源组中,然后加载时全部都放入内存中,包括粗糙
程度不同的多个细节层次模型数据,后面在使用哪个模型时可以迅速从内存中取出进行
渲染,渲染效率比较高。但是这样做对内存的压力很大,资源组中所有的东西都在内存
中,己经离开视野的和没有显示的细节层次模型都还在内存中,无法进行有效的卸载,
有时会使内存不堪重负。本论文会研究OSG中的动态调度技术,加强OGRE资源管理
的效率,缓解内存压力,实现大场景的动态调度。
2.3 OSG三维引擎简介
OSG的英文全称是(Open Scene Graph),意思是幵放场景图形。主要应用于虚拟仿
真、工程可视化方面,基于修改的LGPL开源协议。OSG引擎只支持OpenGL,不支持
DirectX。OSG的环境搭建和OGRE—样复杂,但是方法相近,在此不再赘述。
2. 3.1 OSG的代码结构
1、osg库:这个库包含OSG三维引擎的基本内容,比如有智能指针、公告板、摄
像机、裁减、节点、LOD、PagedLOD等等。在构建场景树结构的时候重点使用这个库,
以及一些其他库所需要的公共部分。
2、osgDB库:包含了各种关于文件处理和数据库部分,本论文研究的重点
DatabasePager就在这个库里面。其他还包含有读写文件、共享状态管理等功能。
3、osgUti丨库:OSG的实用工具部分,里面包含OSG使用过程中的所需的各种工具。
4、osgGA库:包含了窗口视景与用户的交互的管理工具,构建出一个设备抽象层,
并且与平台无关。
5、osgViewer库:视景器,OSG的這染部分主要使用这个库,包括场景、视口、视
景器、植染等等部分。
2.3.2 OSG的场景结构
OSG中有两个树,场景树和渲染树。场景树部分是用户在使用的过程中自己创建,
植染树是OSG根据用户提供的信息进行生成。 12
日制工程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现
3.1.3 DatabasePager中的删除数据的判断原理
一、超过数量删除模式(_targetMaximmnNumberOfPageLOD>0):
1、进入视野的PagedLOD节点添加进活动PagedLOD节点。
2、如果某一顿幵始不使用,则将PagedLOD节点从活动PagedLOD列表中移到不
活动PagedLOD列表中。
3、如果下一顿又开始使用,则将PagedLOD节点从不活动PagedLOD列表中再移回
到活动PagedLOD列表当中。
4、如果PagedLOD总数<=PagedLOD的最大值,直接return
5、删除的数量二 PagedLOD总数-PagedLOD目标最大值
6、如果删除的数量
>不活动PagedLOD数量
删除的数量=不活动PagedLOD数量
7、过期时间=当前倾的引用时间-0.1
过期帖=当前顿编号-1
8、遍历不活动节点列表幵始移除子节点。
9、把子节点送入删除队列,等线程删除。 16
程硕士学位论文 基于OGRE的海量三维模型动态调度技术的研究与实现 开始
^ X r Si
I PagedLOD 节点 1 否
PagedLOD 节点
\\^否进入场
添加到活动