先看看总体
流程走到了更新分页数据库
分页数据库的数据流图
先找上图的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天,正式分页数据库线程跑起来。