查看: 3677|回复: 2

OSG原创教程:最长的一帧(15)

[复制链接]

该用户从未签到

发表于 2008-8-29 13:38:55 | 显示全部楼层 |阅读模式
当前位置:osgViewer/Viewer.cpp第892行,osgViewer::Viewer::updateTraversal()
在完成有关DatabasePager的漫长讨论之前,我们还是来总结一下此行的收获吧,如下图所示:
附图1

1、首先,osg:: PagedLOD节点或者osg:: ProxyNode节点使用setFileName函数,请求运行时加载模型文件为子节点。

2、在场景的筛选(Cull)过程中,OSG将自动取出PagedLOD和ProxyNode中保存的文件名数据,并使用DatabasePager::requestNodeFile函数将其保存到“数据请求列表”中(RequestQueue::_requestList)。

3、DatabasePager内置了两个数据处理线程(DatabaseThread),分别用于处理本地文件和HTTP数据,线程的主要工作是删除“已弃用队列”(RequestQueue::_childrenToDeleteList)中的对象,并从“数据请求列表”中获取新的请求。

4、线程中如果取得新的数据请求,则尝试加载新的模型,判断是否需要预编译模型,并送入“等待编译列表”(_dataToCompileList)。预编译的含义是执行显示列表的创建,纹理绑定,GLSL数据绑定等OpenGL动作,通常情况下预编译模型可以避免它在显示时出现帧延迟。

5、对于编译完成或者无需编译的数据请求,首先创建其KDTree包围体(用于K-Dop Tree碰撞检测计算),然后送入“等待合并列表”(_dataToMergeList),线程让出控制权。

6、场景的每次更新遍历均会执行updateSceneGraph函数,于其中将一段时间内没有进入用户视野的节点送入“已弃用队列”(注意这一工作只限于PagedLOD节点的子节点),并将“等待合并列表”中的新数据使用addChild送入当前的场景图形。

好了,不管您是否真的理解了我所说的一切,我们都要继续前进了。不必拘泥于我所述的东西,您自己钻研和实验所得的才是最重要的。

当前位置:osgViewer/Viewer.cpp第895行,osgViewer::Viewer::updateTraversal()
有了前面的基础,现在我们可以轻松地阅读ImagePager的相关内容了。这个类的工作性质与DatabasePager没什么大的区别,它主要负责的是纹理图片文件的运行时加载工作。

OSG 2.6的版本中,只有osg::ImageSequence可以使用图片数据库来执行工作,通过调用ImageSequence::addImageFile函数,指定运行时加载的图片文件名称。文件将被逐步加载并送入这个ImageSequence对象中。ImageSequence类的主要功能是使用自身包含的Image图片对象序列,实现一种动画纹理的效果。

与DatabasePager相同,ImagePager也内置了一个处理线程(ImagePager::ImageThread),其中随时读取“图片加载请求”(ImagePager::ImageRequest)的内容,并根据其中的文件名使用osgDB::readImageFile加载数据(osg::Image对象)。加载之后的图片数据将被加入到申请它的ImageSequence对象中。

ImagePager本身暂时不具备“分页”的功能,换句话说,在目前的版本中,它不会负责将长时间不用的图片删除。

那么,现在我们宣布——漫长的updateTraversal函数之旅可以在今日划上句号了。好好休息一下,下一周,更艰巨的任务还在后面。

解读成果:
osgDB:: DatabasePager,osgDB::ImagePager,Viewer::updateTraversal。
悬疑列表:
如何调度和实现OSG的多线程机制?什么是“渲染目标实现方式”?如何使用compileGLObjects完成预编译工作?Operation对象在线程中的应用时机是什么?

[ 本帖最后由 array 于 2008-8-29 13:44 编辑 ]

附图1

附图1

该用户从未签到

发表于 2008-8-29 18:09:18 | 显示全部楼层
非常感谢!

该用户从未签到

发表于 2008-9-27 16:03:05 | 显示全部楼层
shafa
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表