如何实现场景的保存和加载 #40
Replies: 5 comments 5 replies
-
|
我理解的原则和用户的需要是,保存的场景要能恢复上一次工作的状态,所以我认为应该:
然后就剩下最后一个问题了。文件格式的选择我有两种方案,GLB 是我认为更合适的,但是实现上可能会稍麻烦一些 保存为 GLB 格式的方案这个方案就是实现一个 GLB 格式子集的保存和读取。咱们用的「Group-Object 两层的简化结构」可以当成树状结构的子集,读取的话不符合的可以不读。gltf 里面没有的东西,比如光源,可以和 blender 一样用扩展的对象。 GLB 格式大概就是场景架构用 JSON 表示,mesh 这些二进制数据附加到后面。这样灵活性和性能都还可以。 我分析的好处是:
不好的地方是:
自己规定一种格式如果要考虑性能,不用可读性,感觉还可以使用 protobuf。XML 感觉太重了,容易出问题的地方比较多。 这个方法也包括 JSON / XML 这样虽然通用的格式,但是要自己制定语义和规范。如果要选这个的话,我分析的好处是:
|
Beta Was this translation helpful? Give feedback.
-
|
我自己更倾向于用 JSON 做载体,主要是轻量且可读性比较好。不过直接用原生 JSON 来存储大量的数值(比如导出的 Mesh 几何数据)性能太差,我们多半会需要混合一些二进制方案。
GLB 确实是一个比较直接的解决办法,而且可以部分使用 Assimp 的导出功能,不过自己维护扩展对象也是一种麻烦。@geezmolycos 提到的自有格式问题,我的看法是:
所以我有一个新想法,就是将项目导出成目录而不是单个文件,用 JSON 和 OBJ 混合的办法平衡通用性和处理自有数据的便捷性两方面要求。直接将项目中每个 Group 导出成一个 OBJ 文件,解决几何数据导出以后不能通用的问题;而将其他所有数据(包括材质数据)都导出到同目录的 JSON 文件里,这部分数据的格式我们自己维护。 |
Beta Was this translation helpful? Give feedback.
-
Scene 序列化格式暂定包含版本等元数据和场景中组、光源和相机列表。 |
Beta Was this translation helpful? Give feedback.
-
Group 序列化格式暂定包含 Object 列表,并记录导出的文件名 Object 序列化格式暂定包含材质、物理属性和 Mesh 列表 |
Beta Was this translation helpful? Give feedback.
-
文件导出方式暂定和导入文件的逻辑保持一致,每个 Group 导出为一个 OBJ 文件。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
功能设想
我的设想是加载保存的文件后,可以还原保存时几乎所有内容,类似 Blender 保存的 .blend 文件。为了达成目标,就应该允许用户保存场景中所有可见的内容(地面棋盘格除外),具体包括:
实现方案设想
实现保存和加载就是实现序列化和反序列化。按照一般的技术习惯,把场景保存成一棵树,利用节点关系保存场景结构是比较清楚的。按这样的思路,调用过程从浅到深依次是:
问题
现在我有几个主要的问题:
Beta Was this translation helpful? Give feedback.
All reactions