osg探究补充:DatabasePager类简介
简介
DatabasePager类,也就是常说的数据库分页技术,简单来说,就是在进行数据库查找时,有可能满足条件的数据很多,为了提高相应速度我们进行数据查找时进行分页查找与显示,当点击下一页时才会进行下一次的查找动作。Osg就是把这个原理应用在了三维大场景中,当我们需要加载一个城市级数据时,因为数据量非常大,而我们感兴趣的范围在某一时刻一般都是很小的一部分,所以我们也可以应用数据分页的技术,对大数据进行”分页”查找并显示。
在osg中DatabasePager执行的动作只有一步,就是在每一帧的更新循环中使用updateSceneGraph函数,把过期的数据卸载掉。并将新加入的数据载入到当前scene中。这些数据都是在用户视野中显示的。所以我们就把用户的视野比作”页面”。我们都知道数据的加载都是非常耗时的操作,更何况是三维模型这种大体量的数据,所以osg把DatabasePager的操作放到了另一个独立于渲染线程之外的线程上进行。
那我们就进入osgDB::DatabasePager中查看这个特殊的线程都进行了什么工作。
osgDB::DatabasePager成员介绍
DatabasePager::DatabaseThread::run()。我们在上面一节中介绍过openThread的用法。在进入DatabaseThread::run()之前我们先对DatabasePager中的一些成员变量进行简单的介绍:
1、DatabasePager::DatabaseThread 类:这是分页数据库的核心处理线程,它负责实现场景元素的定期清理,加载以及合并工作;但是让它一直处于检查各个数据列表的循环状态,这未免太过耗费系统资源。因此,这个线程在平常状态下应当被阻塞,需要时再予以唤醒。
2、DatabasePager::DatabaseRequest 结构体:这个结构体保存了用户的单个数据请求,包括数据文件名,请求时间,数据加载后存入的节点,以及要进行合并的父节点等;除此之外还有一个重要的编译映射表_dataToCompileMap,这个映射表负责保存图形设备 ID 与编译对象(几何体显示列表,纹理等)的映射关系。
3、DatabasePager::RequestQueue 结构体:它负责保存和管理一个“数据请求列表”_requestList,也就是由 DatabaseRequest 对象组成的向量组,除此之外还负责对列表中的数据按请求时间排序。上图中所示的_dataToCompileList 和_dataToMergeList 实际上都是RequestQueue 类型的对象,不过它们所保存的“请求列表”事实上是已经完成加载的“待编译/待合并列表”了。
4、DatabasePager::ReadQueue 结构体:这个结构体继承自 RequestQueue,不过还增加了一个“弃用对象列表”_childrenToDeleteList,也就是 osg::Object 对象组成的向量组。它是数据处理线程中最重要的对象之一,除了可以随时向两个列表里追加数据请求和弃用对象之外,这个结构体还包括了一个 updateBlock 函数,负责阻塞或者放行 DatabaseThread 线程,其根据是:列表中是否存在新的数据请求或弃用对象需要处理,以及用户是否通过函数设置暂时不要启用线程(DatabasePager ::setDatabasePagerThreadPause)。
DatabasePager::DatabaseThread::run()
好,那我们就可以进入DatabasePager::DatabaseThread::run()内部进行解剖了。首先osg会对读取数据的模式按照本地数据和网络数据进行划分。划分的目的是osg会根据不同类型创建不同的线程进行处理,并且网络数据还可以设置缓存路径(OSG_FILE_CACHE)缓存到本地。
然后会对线程安全的队列read_queue上锁,以便在判断过期的数据(childrenToDeleteList)进行清空操作。随后,使用 DatabasePager::ReadQueue::takeFirst 函数,从当前线程对应的 ReadQueue 对象(_fileRequestQueue 或_httpRequestQueue)的队列中取出并清除第一个数据加载请求(DatabaseRequest)。并且在DatabasePager::RequestQueue::takeFirst函数中遍历所有的请求列表(_requestList)判断要加载的数据是否过期,得到最上层的要加载的数据。
再往下看,当databaseRequest->_loadOptions是url数据时并且指定了OSG_FILE_CACHE的路径,那么osg就需要进行缓存工作,然后把databaseRequest 保存到将要合并的列表中(_pager->_dataToMergeList->addNoLock(databaseRequest.get());),再剩下的步骤就是对数据进行编译以及合并到scene中。
原文链接 http://www.3wwang.cn/blog/article.ftl?id=26
osg探究补充:DatabasePager类简介的更多相关文章
- osg探究补充:osg数据加载原理(插件机制简介)
前言 我们接着昨天的继续,昨天主要是讲解了DatabasePager类中的特定的成员变量以及run函数的第一部分,对所要请求加载的数据按照是否是网络数据进行分类加载模式.今天我们就看看数据是怎们加载到 ...
- osg探究补充:Node::accept(NodeVisitor& nv)及NodeVisitor简介
前言 在前几节中,我自己觉得讲的比较粗糙,因为实在是时间上不是很充足,今天我想弥补一下,希望不是亡羊补牢.我们在osgViewer::Viewer::eventTraversal()函数中经常看到这么 ...
- OSG中的示例程序简介
OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...
- OSG中的示例程序简介(转)
OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...
- ImageView类简介
4.8 图片控件 本节将要介绍的是图片控件ImageView,首先对ImageView类进行简单介绍,然后通过一个案例来说明ImageView的用法. 4.8.1 ImageView类简介 Ima ...
- Spring Security——核心类简介——获得登录用户的相关信息
核心类简介 目录 1.1 Authentication 1.2 SecurityContextHolder 1.3 AuthenticationManager和Authenti ...
- DriverManager 驱动管理器类简介 JDBC简介(三)
驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...
- Java基础-日期格式化DateFormat类简介
Java基础-日期格式化DateFormat类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象 ...
- Java基础-StringBuffer类与StringBuilder类简介
Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...
随机推荐
- rpm软件包、yum软件仓库、systemd初始化进程
rpm软件包.yum软件仓库.systemd初始化进程 作者:Eric 微信:loveoracle11g 红帽软件包管理器rpm (Redhat Package Manager) RPM会建立统一的数 ...
- 残差神经网络与inception-resnet
一.基本概念 Residual Connection: 本质是“短路连接” 如下图阴影部分,通过增加shortcuts,加速训练,从而可以训练出更深的模型(I.R.v2 > Inception ...
- JS高级-异步
单线程 只有一个线程,同一时间只能做一件事 原因:避免DOM渲染的冲突 浏览器需要渲染DOM JS可以修改DOM结果 JS执行的时候,浏览器DOM渲染会暂停 两段JS也不能同时执行(修改DOM就冲突) ...
- random的常用方式
Python中的random模块用于生成随机数 1.random.random() #用于生成一个0~1的随机浮点数:0<=n<1.0 >>> import random ...
- java反射的性能问题
java反射效率到底如何,花了点时间,做了一个简单的测试.供大家参考. 测试背景: 1. 测试简单Bean(int,Integer,String)的set方法2. loop 1亿次3. 测试代码尽可能 ...
- OpenCV使用BGR而非RGB格式
日常开发和交流时,我们习惯将图片的颜色通道按照RGB(red, green, blue)进行排列.闲来无聊,在把玩卷积神经网络模型时发现OpenCV并没有按照这个顺序读入图片.好奇地搜索一下OpenC ...
- window.open() 打开的子页面 往主页面传参问题
<!--主页面的代码--><!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- 非常优秀的swiper插件————幻灯片播放、图片轮播
http://www.idangero.us/ http://www.swiper.com.cn/ Swiper中文网 2015-10-15 SuperSlide2: (这是个PC用的滚屏插件,看着不 ...
- 文件上传:swfupload.js、blueimp-file-upload
一.swfupload 1.下载swfupload http://code.google.com/p/swfupload/ 2. 3.API http://www.cnblogs.com/henw/ ...
- ORACLE日常操作手册
转发自:http://blog.csdn.net/lichangzai/article/details/7955766 以前为开发人员编写的oracle基础操作手册,都基本的oracle操作和SQL语 ...