Cesium原理篇:3D Tiles(3)个人总结

摘要:
在代码设计方面,提供了RequestScheduler来管理请求队列的数量和优先级。debugShowContentBoundingVolume用于查看TileBounds。Cesium3DFileStyle可以通过表达式指定渲染样式。这些产品理念和技术细节值得我们学习。tileBounds效果对开发人员非常友好。LODCesium提供了两种LOD策略:添加和替换。但3DTiles是一种树关系,每个Tiles只是一个节点。因此,从3DFiles的角度来看,glTF有许多过度设计的部件。总的来说,我觉得3DFiles发布得很匆忙,很多地方都需要改进。我觉得战略压力大于实际价值,这是一个坑占。

个人结论:目前,在演示层面,3D Tiles问题不大,但项目应用上就不够成熟了,所以问问自己,你是想吃瓜呢还是想吃螃蟹?

1

好的方面


数据规范

      我非常喜欢glTF的整体设计,概括有四点:第一,数据块(Buffer)连续,保证了读写性能;第二,提供了视图(View)和访问器(Accessor)的概念,在不损失数据块完整性的前提下提供类型信息和读取规范,保证了兼容性;第三,逻辑层和数据层分离,两者尽量分离,比如用户想要增加一种风格,只会牵连到逻辑层的调整,不会影响数据层的读写,保证了独立性;第四,逻辑层,也就是业务层是JSON形式,保证了扩展性

glTF

      3D Tiles在逻辑层,也就是JSON部分增加了FeatureTableBatchTable,以及LOD(tileset)概念,并对应提供了header(二进制存储)。从数据规范角度来看,继承了glTF优秀的部分,同时考虑了倾斜,点云,后续也会支持OSM,从数据类型的支持上也比较到位。

Cesium渲染调度

      目前,WebGL技术+三维球开源框架+大数据渲染,如果拿这三个条件来过滤,除了Cesium并没有其他选择,所以这块要求不能太高。

      在这个要求下,通过前两篇的介绍,Cesium在这块的框架设计很清晰,基于状态而不是事件驱动的方式来管理,简化了代码复杂度,在逻辑上没有明显的冲突

      在代码设计上,提供了RequestScheduler,管理请求队列的数量和优先级,debugShowContentBoundingVolume用来查看TileBounds,Cesium3DTileStyle可以通过表达式指定渲染风格,这些产品思路和技术细节都值得我们学习和借鉴的。

 

pointcloud-octree

tileBounds效果,对开发人员很友好

style

风格表达式,提供可视化效果

欠佳

LOD

      Cesium提供了Add和Replace两种LOD策略。我认为只需要Replace一种就足够了,Add是一个鸡肋,不能解决大数据下性能的问题,而Cesium偏偏对Replace支持的不好。整个树结构自始至终都完整保留,卸载时只会删除数据内容,节点属性信息仍然存在。另外删除逻辑过分简单,某些浏览方式下应该会有闪烁问题。

      刚才提到节点的属性信息是初始化一次性加载,如果数据量很大,比如城市级别,这个tileSet会很大很复杂,这点在设计上有点耿直。

数据规范

      这个真的是成也萧何败萧何。首先,glTF是针对单个模型的情况,强调数据的完整性,独立性。但3D Tiles是一个树关系,每个Tile只是其中的一个Node。打个比方,一棵树上,节点是叶子,但现在节点对应的是一颗小树。所以,站在3D Tiles的角度,glTF有很多过度设计的部分。比如shader,animation,scenemanager等,还有纹理部分,不能说做不到纹理公用,但确实在设计上没有体现。

      在渲染调度上,3D Tiles和glTF都是基于状态,你可以想象,虽然在代码逻辑上清晰,但在运行时上,对浏览器来说是一个负担。明明一次性能做好的事情,非要分成好几个任务,还美其名曰敏捷。我觉得一个Tile的解析尽可能在两个Promise,一个Workers搞定,不拖累主线程,事情也做的干净利索。

      FeatureTable实例化的存储设计没有问题,Cesium对应的接口欠妥,要么提供清晰通用的规范,要么只关心存储结构,让用户自己扩展实现实例化部分的Render。

      作为一个大数据的数据规范,glTF可以提供压缩机制,当然Web端解析性能的损耗需要评估,个人认为压缩的收益太大而无法拒绝。

可用性

      缺少免费好用的生成工具,并没有形成一个成熟的解决方案。基于大数据的扩展能力也很少,只有单体化和实例化,属性查询这些基本能力。不知道是否支持2.5维场景,如果能支持,那就牛了。

      总体感觉3D Tiles推出的有点仓促,很多地方还需要打磨,感觉战略压力大于实际价值,属于占坑行为。希望后续能够大力推动,能够早日有成熟的完整方案和高级功能。

开源

      有感于最近的一些亲身经历,也看了看threejs,Openlayers,Leaflet,Echart等项目,也在思考这些优秀的开源项目之所以优秀,到底有没有一些共性。

      就用两句话来概括:所谓的开源(或规范),不是把自己的东西拿出去,而是把别人的东西拿进来当我们把一个东西放到github上开源,我们以为这个工作到此结束了,其实它才刚刚开始

      最后,又想到了论语里面的那句“君子务本,本立而道生“,算是从人的角度,对上面两句话的解释吧。

免责声明:文章转载自《Cesium原理篇:3D Tiles(3)个人总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇2014年可用的TRACKER服务器大全Simulink仿真入门到精通(四) Simulink子系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 使用 SqlBulkCopy 类批量复制数据到数据库

最近公司需要优化导入的问题,由于之前使用的方式是生成 Insert 语句插入数据库,数据量小的时候还行,但是随着发展数据量渐渐大了,之前的方法性能就跟不上了,于是发现了 SqlBulkCopy 这个类。 使用 SqlBulkCopy 类只能向 SQL Server 表写入数据。但是,数据源不限于 SQL Server;可以使用任何数据源,只要数据可加载到...

基于Spark环境对比Python和Scala语言利弊

在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点。 本文翻译自  https://www.dezyre.com/article/Scala-vs-Python-for-apache-Spark/213 1.性能对比由于Scala是基于JVM的数据分析和处理,Scala比Python快10倍。当编写Pytho...

GitLab 数据库

访问 GitLab 数据库 步骤 用的 Docker Gitlab,首先进入容器 docker exec -it gitlab /bin/bash `` 找到数据库配置文件 ```bash /var/opt/gitlab/gitlab-rails/etc/database.yml 内容如下,记录了数据库配置信息 production: adapter...

无法为数据库中的对象分配空间,因为'PRIMARY'文件组已满

用SQL Server2012,做数据保存时出错,错误信息:无法为数据库'***'中的对象'***'分配空间,因为'PRIMARY'文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。 解决办法:打开SQL Server Management Studio,右键报错的数据库,选...

ELK学习笔记之Elasticsearch删除指定日期的数据(脚本+定时任务)

0x00 概述 目前使用的ES版本为6.3.x,经过长时间的积累,ES内数据越来越多,需要删除指定日志之前的日志。 例如只要求保留60天的日志,那么就要删除60天之前的所有索引和日志。 0x01 ES删除XX天之前的索引和数据 #!/bin/sh#ES版本为6.3.x function delIndex() { #此处输入要删除的索引名字...

数据可视化之PowerQuery篇(九)巧用Power Query,Excel也可以轻松管理文档

https://zhuanlan.zhihu.com/p/111674088 ​来自知乎一个朋友的问题,如何在Excel中批量插入文件的超链接,以便在Excel中对文档进行有序的目录管理? 这个问题的方法很多,这里给出一个简便且高效的方法,利用Power Query。   假设需要管理的文档存放于三个文件夹中,   每个文件夹中有4个文件,   下面就...