Cesium的新武器!Reality Tiler V2的发布,让三维瓦片的构建性能迈上一个新台阶!

大家好,我是日拱一卒的攻城师不浪,致力于技术与艺术的融合。这是2025年输出的第1/100篇文章。

前言

去年给自己定的100篇的目标,但最终只完成了一半,大多都是Cesium相关。

2025年,我的目标依旧是100篇,不过今年我一定会完成这个目标,而且文章涉及的领域也会更多,包含但不限于Cesium三维可视化AI人工智能等领域。

虽然大家都知道现在外边大环境不好,但作为普通人,我们不能跟着大环境一起颓废,越是在低谷期,越是机会更多的时期,有一个词:厚积薄发,所以当机会来临的时候,我们才能够有足够的底气去把握住!

所以请还未关注我的小伙伴们快来关注我吧,2025让我们一路前行!

好了,鸡汤喝完了,让我们言归正传。

简介

2023 年 11 月的时候,Cesium官方发布了Reality Tiler ,它取代了当时的摄影测量瓦片工具,成为Cesium ion和自托管产品中包含的3D瓦片的一部分。

官方构建Reality Tiler时,强调了可扩展性瓦片性能运行时效率。今天,我们深入探讨于2024年7月发布的Reality Tiler v2

我们将介绍Reality Tiler的完整重构,从头开始重建瓦片管道,带来了瓦片时间、瓦片质量和运行时性能的显著提升。我们将仔细研究内存和运行时性能指标,最后讨论进一步改进和下一步的优化。

在深入探讨之前,请注意Reality Tiler 主要用于摄影测量模型或从LiDAR扫描重建的模型,可能规模巨大。这些模型通常由显式几何(例如三角网格)和颜色纹理信息组成。

为什么要重构?

Reality Tiler的第一个版本通过对整个输入模型进行迭代简化和细分来操作。

尽管瓦片器使用了外核技术以确保我们不会耗尽内存,但它有两个缺点。

首先,数据访问模式不连贯。在生成瓦片或简化模型时,所需的一系列操作的数据未合并到连续的内存块中,导致频繁的缓存未命中,并需要在磁盘和RAM之间进行不必要的分页。这些类型的访问模式可能会显著减慢处理速度。

这种方法的第二个缺点是它在整个过程中创建了固定数量细节层次(LODs)。对于相对均匀的模型,这是一个合理的方法,但有些模型并不均匀。实际上,许多模型具有高细节区域和低细节区域。

例如,模型的某些部分可能具有比其他部分高得多的三角形密度或使用更高分辨率的纹理。固定数量的LOD可能会创建不平衡的瓦片集,其中一些瓦片包含过多信息,而其他瓦片包含过少信息。在运行时,这会转化为不一致的性能:过多的大瓦片会导致帧率降低,过多的小瓦片可能导致过多的网络请求和缓慢的流式传输。

从全局到局部

我们考虑了几种策略来解决Reality Tiler v1的缺点,但最终决定彻底颠覆整个过程。

我们不再采用全局方法(即在生成瓦片和执行简化时对整个模型进行操作),而是采用局部方法,一次只处理模型的一部分。

更具体地说,Reality Tiler v2将模型拆分为叶子瓦片,并通过迭代合并和简化瓦片来构建瓦片集,直到只剩下一个根瓦片。

由于各个瓦片相对较小且在内存中大多是连续的,数据访问更加连贯,因此整体过程显著加快。

使用Reality Tiler v2时,我们确保每个叶子瓦片的大小大致相同(就几何和纹理内容而言,而非世界空间中的范围)。

这意味着,对于具有密集几何或纹理数据的输入模型的某些部分,可能会进行更深的瓦片,而树上更高的瓦片大小大致相同。

结果

通过转向这种新的局部瓦片方法,我们在瓦片性能和内存使用方面看到了显著的改进。以下是几个数据集的结果。(所有测试均在具有256GB RAM、64核CPU和4TB NVMe驱动器的机器上运行。)

Reality Tiler 瓦片时间比较

数据集 三角形数量(百万) 之前的瓦片时间(时:分:秒) 新的瓦片时间(时:分:秒) 瓦片时间减少百分比
Carrick Hill(澳大利亚) 3.3 0:02:37 0:01:11 55%
利物浦(英国) 7.8 0:08:48 0:02:54 67%
布达佩斯(匈牙利) 43.1 0:59:05 0:14:08 76%
墨尔本(澳大利亚) 69.9 3:22:41 0:27:58 86%

Reality Tiler 内存使用比较

数据集 三角形数量(百万) 之前的峰值内存(GB) 新的峰值内存(GB)
Carrick Hill(澳大利亚) 3.3 9.5 3.5
利物浦(英国) 7.8 14.1 4.2
布达佩斯(匈牙利) 43.1 36.8 13.8
墨尔本(澳大利亚) 69.9 54.2 18.5

可以看到,Reality Tiler v2 瓦片时间全面缩短,比 Reality Tiler v1 快约 2-7 倍。

一般来说,输入越大,加速比越大。内存需求趋势也有类似的增长,最大的数据集的峰值内存使用量减少幅度最大(对于较小的数据集,我们看到这些样本的内存使用量略有增加)。

总而言之,这些改进表明 Reality Tiler 的可扩展性得到了显着提高:它能够在更短的时间内处理更多的数据,同时通常使用更少的内存。

由于瓦片不均匀,我们还发现瓦片文件大小的变化有所减少。例如,澳大利亚墨尔本是一个没有统一大小三角形的数据集,因此它特别受益于非均匀瓦片

使用统一大小瓦片的 Reality Tiler v1,墨尔本的平均瓦片大小为 1.28 MB,标准偏差为 706 KB。对于 v2 ,平均分块大小为 395 KB,标准差为 192 KB

未来展望

自 Reality Tiler v1 版本发布以来,我们已经取得了长足的进步,对于未来的增强功能,我们仍然有许多想法。

我们工作任务中的两个最大瓶颈现在是纹理压缩纹理坐标生成。我们未来会持续关注这两方面。

我们还将努力进一步降低峰值内存使用量。尽管网格数据主要是在核心外处理的,但帮助我们对其进行索引的数据结构驻留在内存中。官方计划调整此结构,使其不完全驻留在内存中。

有兴趣的朋友可以登录自己的Cesium ion帐户免费开始体验更新后的Reality Tiler,感受炸裂的性能。

有需要进可视化&Webgis交流群可以加我:brown_7778(备注来意),另外也可接项目合作。

相关推荐
x_chengqq3 小时前
前端批量下载文件
前端
捕鲸叉5 小时前
QT自定义工具条渐变背景颜色一例
开发语言·前端·c++·qt
傻小胖5 小时前
路由组件与一般组件的区别
前端·vue.js·react.js
Elena_Lucky_baby5 小时前
在Vue3项目中使用svg-sprite-loader
开发语言·前端·javascript
重生之搬砖忍者6 小时前
uniapp使用canvas生成订单小票图片
前端·javascript·canva可画
万水千山走遍TML6 小时前
console.log封装
前端·javascript·typescript·node·log·console·打印封装
阿雄不会写代码6 小时前
使用java springboot 使用 Redis 作为消息队列
前端·bootstrap·html
m0_748236587 小时前
【Nginx 】Nginx 部署前端 vue 项目
前端·vue.js·nginx
@C宝7 小时前
【前端面试题】前端中的两个外边距bug以及什么是BFC
前端·bug
Burt7 小时前
@antfu/eslint 支持 globals 全局变量
前端·uni-app·eslint