OSG动态调度DatabasePager,pagedLOD

使用动态调度的原因

当用户需要浏览的数据量很大,比如地形模拟、虚拟小区和城市等的时候,会对计算机系统产生极大的负担。
在内存中可能要存储海量数据,这些海量数据指的是数百GB甚至TB级别的数据(例如中国境内的山形地貌等),这些不可能全部载入内存中,就算未来的计算机能够将它们一次性读入,也已经损耗了太多的系统性能。

动态调度的原理

在显示当前视域中的场景元素(可见元素)的同时,预判断下一步可能载入的数据(预可见元素),以及那些短时间内不可能被看到的对象(不可见元素),从而作出正确的数据加载和卸载处理,确保内存中始终维持有限的数据额度,并且不会因此造成场景浏览时重要信息的丢失或者过于迟缓。
数据的动态调度可以使用多线程的工作方式,使数据的动态调度和场景的实时绘制同时进行。由于动态数据的加载/卸载可能影响到场景树的结构,因此这一工作需要在场景更新的阶段完成,以免影响到裁剪和绘制的过程。

动态调度的过程

(1) 删除过期的场景数据:过期数据指的是那些长时间没有处于用户视域内,并且有理由认为它们不会立即显现的场景元素。场景的更新遍历函数负责将检索到的过期对象收集并送入相应的过期对象列表;而列表中的数据通常可以在数据线程中统一予以删除。
(2) 获取新的数据加载请求:请求加载的可能是新的数据信息,也可能是已有的场景数据(曾经从“当前页面”中去除,更新又回到“当前页面”中);数据可能是本地的文件,也可能来自网络;从网络下载的数据往往还需要缓存在本地磁盘上。这些都需要在数据线程中一一加以判断。
(3) 编译加载的数据:有些数据如果提前进行编译可以有效地提升效率,例如为几何体数据创建显示列表,以及将纹理对象提前加载到纹理内存。虽然OSG同样可以在负责渲染的主进程中根据用户需要执行这些工作,但是那样有可能造成帧的延迟。例如,一个大型场景的显示和调度过程中,如果大量的地块数据同时被加载入内存,那么下一帧的数据编译任务将变得十分繁重,继而造成较为严重的帧延迟。此时如果由数据线程负责预编译的工作,则可以在一定程度上缓解这一压力。
(4) 将加载的数据合并至场景图形:直接由数据线程

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值