动态调度技术
如果数据庞大,那么是不可能一次性全部载入内存的,因此需要动态调度技术。
动态调度技术:在显示当前视域中的场景元素的同时,预判下一步可能载入的数据,以及那些短时间内不会被看到的数据,从而做出正确的数据加载和卸载处理,确保内存中始终维持优先的数据额度,并且不会因此造成场景浏览时重要信息的丢失或过于迟缓。
如果预加载数据过度,也会影响系统连贯,所以采用"数据进入视域后才进行加载"的策略,此时场景中的图像可能突然闪现。
数据的动态机载将会影响到场景树的结构,因此这一工作要在场景更新阶段完成,以免影响到裁剪和绘制的过程。
分页数据库
在osg中,osgDB::DatabasePaper类负责执行场景动态调度,视景器每一帧下执行到更新遍历函数updateTraversal()函数时,都会自动将"一段时间始终都不在当前页面上"的场景子树去除,并将"新载入到当前页面"的场景子树加入渲染。这里的分页就是用户的事也范围。分页和节点的管理工作由DatabasePager内置的数据线程负责。
数据的动态调度过程可以分解为以下几个功能:
- 删除过期的场景数据
- 获取新的数据加载请求
- 编译加载的数据:例如为几何体数据创建显示列表。
- 将加载的数据合并到场景图形
osg::PageLOD
分页数据库主要处理的对象就是osg::PageLOD。osg::PageLOD继承于osg::LOD。它除了会将数据模型分为多个细节层次,根据距离显示之外,还会用到分页数据库的功能,动态加载到场景图中,并根据用户当前的可视范围,将那些一段时间内无法被看到的子节点从内存卸载。
从代码中可知,创建osg::pageLOD节点后,为其添加一个子节点,同时设置filename,filename中的场景就是实际场景,设置范围,当超出范围后,实际场景将被子节点取代。