记使用Cesium渲染三维场景导致崩溃的优化思路跟过程
一、计算机配置
硬件 | 参数 |
---|---|
内存 | 64G |
CPU | 13代 i5 |
显卡 | 英伟达 3090 (24G显存) |
二、问题描述
通过Cesium做三维场景有个通病(也可能是学艺不精),就是加载了大量模型后,如果不做优化,或者不优化模型的加载策略就会导致崩溃。
崩溃发生在做某项操作的时候,或是长时间不操作,比如72小时不操作,也会自然崩溃。这种崩溃不是必现的。
崩溃类型有两种:
- 爆内存
- 爆显存
三、 排查问题思路
1. 思路主要是围绕: 如何降低内存跟显存的消耗为切入点
2. 主要两个方向
- postRender(执行频率很高)
- 优化模型或优化模型的加载策略
3. 效果
Plan A
:通过实践,优化 postRender 执行的频率确实有一点用,就是防抖嘛,但是如果执行频率太低又会导致场景更新不及时,所以这部分的优化是局限的,而且并不解决问题。
那就只能把解决问题的核心思路放到 Plan B
对模型优化了
四、 通过优化模型对项目进行优化
优化模型
有两个方向(两条腿):
- 一条腿是走:对模型本身做轻量化处理的路线(让专业的人搞就行了,俺也不用太操心)
- 另一条腿:优化模型的加载策略(这个方向是我要做的,这个俺专业,毕竟
攻城狮
嘛)
模型的状况
项目 | 数量 |
---|---|
大模型 | 数十个 |
小模型 | 数千个 |
开干开干👇
ID | 待优化 | 方案 | 效果 |
---|---|---|---|
1 | 模型一股脑全部加载,导致计算机一瞬间的负荷太大,增加崩溃的风险 | 这个好办,那就分批加载 | 保证首屏不会崩溃 |
2 | 模型全量,全局加载 | 模型按需加载 ,只显示当前需要显示的模型 | 内存降低30% - 50%,模型加载的少了,显存的消耗也就降下来了,崩溃问题的解决也是水到渠成 |
3 | 大量小模型 | 替换为小图标 | 有效果,指标无法量化 |
4 | 影像图层不是每个场景都需要 | 图层按需加载 | 有效果,指标无法量化 |
5 | postRender 优化 | 降低执行频率 | 有效果,指标无法量化 |
我发现 Cesium 有一个机制,那就是加载了大量模型后,GPU的占用持续保持的90% - 100%,不会降下来,难道是因为瓦片加载的原因吗,欢迎大佬讨论交流?
其实 Cesium 加载 3DTiles 的优化方案还是很多的,具体 Cesium 官网文档都有提及,但是因为这个项目早期的一些情况导致这些策略都不适用。
加载的模型可以理解为一个模型是一个瓦片,你说它是瓦片吧,它却只有一个瓦片,说他不是瓦片吧,确实又是3DTiles格式的,所以分片加载又从何说起呢
五、 补充
我发现 Cesium 加载3DTiles,在primitives.add 之前,设置tiles.show = false,Cesium 引擎并不会判定该tiles占用内存,tiles.show 由 false 转为 true 之后,该tiles 开始占用内存,到这里都可以理解。但是再由 true 转为 false,内存的占用大约为 Size / 2,不知道Cesium 的缓存机制是什么样的,欢迎大佬讨论交流。