现在因为要进行 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天的内容应该结束了。