现在因为要进行 DatabasePager::DatabaseThread::run()的跟踪,已经在renderingTraversals()流程了。

整个流程如下

可见,场景剔除影响到了分页数据库的变化,

跟踪






如果请求加载的文件来自HTTP网络且已经设置了OSG_FILE_CACHE,则本地文件处理线程将尝试建立同名的文件缓存路径

每次循环开始时,阻塞数据处理线程,避免无谓的系统消耗,知道updateBlock函数在外面执行才被放行,继续下面的代码。




可以看到updateBlock()已经调用了,几种情形下可能执行updateBlock()
1,ReadQueue对象中的数据请求列表被修改,例如新的数据加载请求被传入,请求被取出,列表被重置。

2,ReadQueue对象中的弃用对象列表被修改,例如有新的过期对象被送入,对象被删除,列表被重置。
3,执行了DatabasePager::setDatabasePagerThreadPause函数,当线程被重新启动时,会自动检查线程是否应当被唤醒。




从当前线程对应的ReadQueue对象(_fileRequestQueue或者_httpRequestQueue)队列中取出并清除第一个数据加载请求(DatabaseRequest),



以上应该是第12天的内容,下边才是第13天的内容,失误了。
下一步就处理这个请求
很多帧之前的请求不处理

判断请求加载的文件是否来自HTTP网络,且已经设置了系统变量OSG_FILE_CACHE,那么本地文件处理线程将尝试建立同名的文件缓存路径,并将请求转交给网络文件处理线程的_httpRequestQueue处理


使用DatabaseThread::dpReadRefNodeFile加载文件,线程安全。加载的过程可长可短,由于是在数据处理线程中完成的,因此不会影响到主场景的渲染。





































一切顺利的话,现在所有需要预编译的对象(StateSet与Drawable)都已经记录到图形设备-编译对象的映射表_dataToCompileMap中了。这里OSG将需要编译的对象复制到每个GraphicsContext图形设备的对应映射像中。






设置是否执行对象的预编译。


















将映射表_dataToCompileMap中所有的StateSet和Drawable对象,并依次执行StateSet::compileGLObjects和Drawable::compileGLObjects函数。待编译列表中的对象在预编译完成后会转存到待合并列表中。











第13天结束了,但是有个问题,那就是pagelod的每个文件名应该是插件可以读取的。而这里是随便写的,所以会出现问题。

换成.osg格式的用户名放入pagelod









这次正常加载了,说明pagelod确实要挂接可以读取插件的后缀名

发现有文件没有找到的错误,确实,没这些文件

要事先把这些文件写到硬盘里。

可以看到有文件写入

现在重新加载
发现只有一个,有误

更正后ok
这次加载上了

这次加载的数据有效了



对状态,几何体和kdtree分别apply




已经成功加入待合并列表




到这里,第13天的内容应该结束了。

本文介绍了分页数据库加载过程中的关键步骤,包括跟踪DatabasePager::DatabaseThread::run()函数、处理HTTP网络文件缓存、加载请求、预编译StateSet与Drawable对象等。此外还讨论了文件格式对加载的影响。
8508

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



