查看: 2011|回复: 25

集思广益:解决快速更替海量数据问题

[复制链接]

该用户从未签到

发表于 2010-12-9 10:42:31 | 显示全部楼层 |阅读模式
本帖最后由 sdd548 于 2010-12-9 15:06 编辑

标题说得不是很清楚,具体的说一下:

数据:每个文件70W个顶点,100w个三角形组成的三维TIN表面模型,转成IVE模型文件后的大小约40M
      一共1000个文件,按时间序列排列。

要求:
1、保证在OSG三维可交互环境下;
2、按时间序列需要将1K个文件至少按照0.2/文件 的速度逐一播放,形成三维动画,保证动画的流畅性;
3、保证交互的流畅性,帧率在10fps以上。

分析:
4、读数据的总时间,未经过详细测试,约2/文件,远大于 播放的总时间。所以,无论如何动态调度,如果所有数据都需要加载一遍的话,播放显示总需要停下来等数据加载;

5
、所以需要提前加载数据,但!内存有限,加到第50个文件就崩了;


6
、退而求其次,只加载部分数据。


方法:

7
、方法一,牺牲数据精度,高度简化成1K个三角形的TIN,可看,但不可测;


8
、方法二,分层分块,期望用户在短短的3min的播放时间内不要访问到所有数据,不然又相当于在播放时间内需要把所有数据加载一遍;


9
、方法三,限制在播放时数据访问,控制内存中最多存在一个时刻的高精度数据,即在播放时只加载低精度模型,在播放暂停或停止时,加载高精度模型;


10
、方法四:升级硬件,内存升级到8G了,不解决实际问题;


11、方法五六七:……

以前问过一次,但是大家都是纸上谈谈兵,说用分层分块。这次动真格的了,发现从理论上说分层分块就有缺陷,需要限制用户的交互行为(也许三分钟时间没有哪个用户会把所有的地方都看个遍)。所以再次搬出去求救,希望大家提提建议,启发思路,还有太多的方法我肯定都想不到没见过,让小弟长长见识呗!谢了~
好长,希望能把问题描述清楚。

也可QQ上详聊:7307869
邮箱也OK:sdd548@yahoo.com.cn
面谈也行:那就再约
或者:所有人都说这个不可能,我就不做了

该用户从未签到

发表于 2010-12-9 11:41:42 | 显示全部楼层
本帖最后由 Roc 于 2010-12-9 11:43 编辑

看看WorldWind Java版的方法吧

该用户从未签到

发表于 2010-12-9 11:59:26 | 显示全部楼层
你这是项目级的海量了

该用户从未签到

 楼主| 发表于 2010-12-9 12:22:59 | 显示全部楼层
2# Roc
关键是我的数据是时时切换的,每0.2秒需要换一整套数据,不是空间海量的问题,而是在时间上切换太快,数据加载跟不上。

该用户从未签到

发表于 2010-12-9 13:30:42 | 显示全部楼层
按时间序列需要将1K个文件至少按照0.2秒/文件 的速度逐一播放,形成三维动画,保证动画的流畅性
单就这个奇怪的要求来看,一般的方法恐怕没有可能

唯一的希望是使用shader来实现,一张1024x1024的纹理可以至少保存100W个点的位置信息,如果这些点组成的是规则的地形网格的话,可以在vertex shader中将它们构建为地形,然后在fragment shader中着色。纹理动画的方法可以保证这些纹理的切换以及地形的快速变化

该用户从未签到

 楼主| 发表于 2010-12-9 14:03:34 | 显示全部楼层
本帖最后由 sdd548 于 2010-12-9 14:07 编辑

5# array
三维的TIN,点是三维空间分布的,和地形的2.5维不一样,也不是栅格点。也许和Lidar点云类似。
尽管要求很奇怪,但是动画效果是一定要实现的,否则就偏离项目“时空”的主题的。
如果被鉴定为不可实现,我就采用第9条,方法三。然后给一个安慰自己的理由:可视化时只需要“可视要求”,低精度模型即可;在播放暂停或停止时,才能进行“量测”操作,此时用高精度模型才有意义。
现在就是在等待专家认证,从理论上给他以"impossible”的定论。

该用户从未签到

发表于 2010-12-9 14:05:28 | 显示全部楼层
就算不是地形,也可以使用shader构建,这种思路应该是可行的;至于如何把所有的信息都通过纹理映射表传入vertex shader,那就是您的问题了。

该用户从未签到

 楼主| 发表于 2010-12-9 14:10:23 | 显示全部楼层
7# array
好,我尝试一下,需要一段时间,shader不是很熟。谢谢锐哥

该用户从未签到

 楼主| 发表于 2010-12-9 15:24:00 | 显示全部楼层
本帖最后由 sdd548 于 2010-12-9 15:31 编辑

可不可以这么理解?
我用shader将我的海量三维点根据坐标构建一个东西,然后在fragment shader中将这个东西着色。

那实时用shader构建,是不是也需要从文件中读入70W的点的坐标?那读文件的时间还是很长。

那如果在事先读1K个文件点坐标,内存装还是不下

那如果在事先用shader构建的三维东西,是不是可是事先存储起来,是不是它“占内存特别小!”,以至于我可以一次性吧1K个这样的东西都放进内存里?然后在快速切换。

我之前有实现过将1个文件压缩到500KB以下,内存可以一次性放下1K个文件,用Sequence实现了快速切换。

该用户从未签到

发表于 2010-12-9 18:02:38 | 显示全部楼层
你把数据存成纹理之后,应该shader里读纹理更新。不过,貌似处理的数据还是不少

该用户从未签到

发表于 2010-12-10 08:32:15 | 显示全部楼层
那实时用shader构建,是不是也需要从文件中读入70W的点的坐标?那读文件的时间还是很长。
答案是使用纹理来存储数据,然后查找纹理中的每个像素并进行并行处理。这很不好控制,但是完全是可能的(google earth就是结合分块与GPU算法来构建地形的,不需要预处理),而且速度是CPU的200万倍(没有说错,就是这么多,只不过GPU的结构只适合并行计算的范畴而已)

该用户从未签到

发表于 2010-12-10 11:02:50 | 显示全部楼层
速度是CPU的200万倍。。。。。。

该用户从未签到

 楼主| 发表于 2010-12-10 12:09:55 | 显示全部楼层
11# array
还要用GPU啊,但是显存更小,能一次性存下这么多数据吗?
如果不是一次性存如1K个纹理文件的数据,但还要花时间在硬盘与显存的数据通讯上,岂不是也耗费时间,跟不上播放速度?

该用户从未签到

发表于 2010-12-10 14:44:46 | 显示全部楼层
一张1024x1024的纹理图片,如果是RGBA格式的话,相当于1024x1024个Vec4值,也就是大于100万个Vec4的值。您的数据点不是只有70万个吗~~况且这只是一张纹理图片的容量而已……

该用户从未签到

发表于 2010-12-10 20:32:55 | 显示全部楼层
本帖最后由 yin_savage 于 2010-12-10 20:35 编辑

采用数据替换的方式可能难度比较大。若是动画,能否考虑使用osgAnimation来做这个事情呢?我的上一个项目就是这样做的,里面的动画已经很多了,是一个复杂的矿山掘进机的工作过程,挖掘头、灌浆机、石块塌陷、通风系统同时运作,互相协调。这个动画系统里面运动的物体非常多,仅掘进头就有十几个,互相协调运动的同时,还要协调路径动画。

    一开始用Max或者其它建模工具来制作每一个部件的运动过程,对这些运动部件的命名要求非常严格,不同的运动规律的物体具有不同的名字前缀(这个一开始要规划好)。这些唯一的前缀用数据库管理起来,某个部件啥时候启动、啥时候停下来等待,一开始都要设计好(可以用脚本,不过我没有用,而是采用了更原始更低级的办法,缘于我没时间做脚本那一块的事情)。我面的描述,可以简化为一句话:凡事要运动的部件,都赋予一个唯一的ID,用数据库之类的东西管理起来。
    程序启动之后,使用一个NodeVisitor来找到所有的运动部件,用自定义的数据结构管理起来。然后按照前面设计好的脚本内容,设置每一个部件的开始运动时间和运动速度。
    再就是有些动画也许可以简化一下,比如使用纹理动画来完成。你只需要自己写一个类来不断更新物体的纹理矩阵即可。

    按照上面的方式来做,比海量数据替换要难做一些,而且事先几乎无法所见即所得地看到动画效果(能看到的只是部件的零碎动画),但是这种方法只要一套数据就可以解决问题,不需要为每一帧来全部重新读取数据。也就是说绕过了大数据进出内存的门槛。

该用户从未签到

 楼主| 发表于 2010-12-12 17:17:19 | 显示全部楼层
15# yin_savage
节点动画、轨迹动画的方式我们也在用,但是关键是只能模拟轨迹或简单动画。
现在这个每一帧的数据是利用力学仿真计算出的空间坐标结果,花了近一个月的高性能计算才算完的结果,虽然都是模拟,但应用目的不一样。

该用户从未签到

发表于 2010-12-14 18:17:42 | 显示全部楼层
若是非规律性的轨迹动画,那么问题的确难办了。也许你真的要每一帧换一个模型……
亦或是先离线渲染成一张张的图片系列,然后压缩成视频给用户看看算了。

该用户从未签到

 楼主| 发表于 2010-12-14 23:40:02 | 显示全部楼层
做成视频是最不可取的,因为主要目的就是要打破视频的局限。
再问问锐哥,用你说的方法是不是我得有个几何体来作为动态纹理的载体啊?

该用户从未签到

发表于 2010-12-15 13:36:07 | 显示全部楼层
那是肯定的

该用户从未签到

发表于 2010-12-15 15:41:03 | 显示全部楼层
"我之前有实现过将1个文件压缩到500KB以下,内存可以一次性放下1K个文件,用Sequence实现了快速切换。" 这个方法的问题在哪呢?解压需要的时间达不到要求么?

我觉得从工程项目的角度第9条方法三就能满足要求吧?除非需要看局部细节的动画过程。但是对应的,也应该有其他方式去解决(比如局部高精度模型数据的保存和加载)。

如果从技术实现角度,可以试试array的建议,不过空间顶点本身如果没有规律,好像很难呢。

该用户从未签到

发表于 2010-12-15 16:01:47 | 显示全部楼层
本帖最后由 gavinyu 于 2010-12-15 16:19 编辑

另外,不考虑硬件条件,理论上,可以来个分布式。
看到别人做过千M网最大传输速率能到58M/S,换成单模光纤的,多弄几台机器,就能做到了哈。

该用户从未签到

 楼主| 发表于 2010-12-16 15:54:15 | 显示全部楼层
19# array
1000个文件是个水流模拟的数据,大变形的,没有固定的几何体啊。那锐哥的方法是不是可以宣布在这不能用了?

该用户从未签到

 楼主| 发表于 2010-12-16 15:55:27 | 显示全部楼层
20# gavinyu
我已经不止N次提过就用方法9,局部高精度的模型动态加载进来,但是我决定不了这个项目。

该用户从未签到

 楼主| 发表于 2010-12-16 15:58:02 | 显示全部楼层
无论是整体的还是局部的,各种尺度小的动画都要看,因为是开放式的三维交互环境。所以方法9从这个要求上来说就不可取。
是不是这个项目所提的要求太高了?在目前的硬件条件下。

该用户从未签到

 楼主| 发表于 2010-12-16 16:05:45 | 显示全部楼层
21# gavinyu
这个用光钎联网的方式也许可以尝试一下,但是不知道这么大的硬件支持值不值的

该用户从未签到

发表于 2010-12-16 16:58:23 | 显示全部楼层
那锐哥的方法是不是可以宣布在这不能用了

只要有一个同样顶点数的大平面就可以了,然后在vertex shader里进行肆意的变形,唯一要注意的就是精度的问题~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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