简介

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类简介的更多相关文章

  1. osg探究补充:osg数据加载原理(插件机制简介)

    前言 我们接着昨天的继续,昨天主要是讲解了DatabasePager类中的特定的成员变量以及run函数的第一部分,对所要请求加载的数据按照是否是网络数据进行分类加载模式.今天我们就看看数据是怎们加载到 ...

  2. osg探究补充:Node::accept(NodeVisitor& nv)及NodeVisitor简介

    前言 在前几节中,我自己觉得讲的比较粗糙,因为实在是时间上不是很充足,今天我想弥补一下,希望不是亡羊补牢.我们在osgViewer::Viewer::eventTraversal()函数中经常看到这么 ...

  3. OSG中的示例程序简介

    OSG中的示例程序简介 转自:http://www.cnblogs.com/indif/archive/2011/05/13/2045136.html 1.example_osganimate一)演示 ...

  4. OSG中的示例程序简介(转)

    OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...

  5. ImageView类简介

    4.8  图片控件 本节将要介绍的是图片控件ImageView,首先对ImageView类进行简单介绍,然后通过一个案例来说明ImageView的用法. 4.8.1  ImageView类简介 Ima ...

  6. Spring Security——核心类简介——获得登录用户的相关信息

    核心类简介 目录 1.1     Authentication 1.2     SecurityContextHolder 1.3     AuthenticationManager和Authenti ...

  7. DriverManager 驱动管理器类简介 JDBC简介(三)

    驱动程序管理器是负责管理驱动程序的,驱动注册以后,会保存在DriverManager中的已注册列表中 后续的处理就可以对这个列表进行操作 简言之,驱动管理器,就是字面含义,主要负责就是管理 驱动 概述 ...

  8. Java基础-日期格式化DateFormat类简介

    Java基础-日期格式化DateFormat类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象 ...

  9. Java基础-StringBuffer类与StringBuilder类简介

    Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...

随机推荐

  1. delphi XML简单处理

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  2. 【python】参数中的*args和**kwargs

    转自https://www.cnblogs.com/xuyuanyuan123/p/6674645.html#undefined 多个实参,放到一个元组里面,以*开头,可以传多个参数:**是形参中按照 ...

  3. Win10下JDK环境变量的设置

    1.找到jdk正确的安装路径 2.打开环境变量设置 打开"资管管理器"后,右击"此电脑",点击"属性" 然后点击"高级系统设置&q ...

  4. 知识点:Mysql 基本用法之存储过程

    存储过程 一. 介绍 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql 使用存储过程的优点: 用于替代程序写的SQL语句,实现程序与sql ...

  5. 长短记忆神经网络LSTM

    转载: https://www.jianshu.com/p/dcec3f07d3b5 https://blog.csdn.net/dream_catcher_10/article/details/48 ...

  6. [SQL]某数据库中查出包含 字段名 的所有表名

    --利用SQL语句来查询字段所在的表 --从某数据库中查出包含 字段名 字段的所有表名 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE ...

  7. base64 压缩上传上传图片

    @{ ViewBag.Title = "dddddddd"; Layout = "~/Areas/Wap/Views/Shared/_Head.cshtml"; ...

  8. C语言数据结构基础学习笔记——C语言基础

    抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示抽象数据类型. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合, ...

  9. Rabbitmq(5) 路由模式

    设置路由键 发送者 package com.aynu.bootamqp.service; import com.aynu.bootamqp.commons.utils.Amqp; import com ...

  10. 第二篇*2、Python字符串格式化

    1.字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 1)百分号方式 %[(name)][flags][width].[precision]typecode (nam ...