先看看总体

流程走到了更新分页数据库





分页数据库的数据流图

先找上图的4个成员变量





上图中,左侧的图框表示数据的检索和输入;中间的白色图框表示用于数据存储的内存空间,而右边的图框表示存储数据的输出。此外,蓝绿色图框表示可以在DataBaseThread线程中完成的工作,而橙色图框表示由线程之外的函数完成的工作。
从上图可以看出osg的分页数据库使用线程处理的事情,抄一抄。
1,删除过期的场景数据,为了避免场景渲染的延迟,所以不在仿真循环中进行,而是采用线程来处理。过期对象的统一删除工作在这里完成,而更新遍历则负责将检索到的对象送入相应的过期对象列表。
2,获取新的数据加载请求。请求加载的可能是新的数据信息,也可能是已有的场景数据(曾经从当前页面中去除,更新又回到当前页面中),可能是本地的数据文件,也可能是来自网络,并需要把下载的数据缓存到本地磁盘。这些都需要在线程中一一加以判别。
3,编译加载的数据。有些数据如果提前编译可以有效地提升效率,例如为几何体数据创建显示列表(Display List),以及将纹理对象提前加载到纹理内存;虽然OSG同样可以在渲染时根据用户需要执行这些工作,但是势必会造成帧的延迟。如果系统配置足够高,也可以用图形设备线程GraphicsContext::getGraphicsThread完成。
4,将加载的数据合并至场景图形。将读入的数据先保存在一个列表中,并且由仿真循环负责获取和合并新节点。
看看分页数据库的几个数据结构





可见,这个编译对象是stateset和drawable的对应关系。
看看readwriter::options的结构体和成员变量,看看大概有什么















_databaseThreads有两个线程,分别处理本地文件的数据队列和网络数据队列

从文件名判断是本地数据还是网络数据

来自网络的数据也可以缓存到本地,通过设置环境变量OSG_FILE_CACHE的方法

现在万事俱备,可以调试进去了


































运行的话,应该用Pagelod了,


这次不为空


没有到期需要删除的

合并列表为空

触发osgDB::DatabasePager::DatabaseThread::run (),实际上还是在renderTraverse()时,


可以跟踪一波了。

准备第13天,正式分页数据库线程跑起来。

本文围绕OSG分页数据库展开,介绍了其数据流图,包括数据检索、存储和输出等部分,以及不同颜色图框代表的工作线程。详细阐述了线程处理的四项工作,如删除过期场景数据、获取新数据加载请求等。还提及了分页数据库的数据结构、线程设置等,最后准备让分页数据库线程正式运行。
3万+

被折叠的 条评论
为什么被折叠?



