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