记使用Cesium渲染三维场景导致崩溃的优化思路跟过程

669 阅读3分钟

记使用Cesium渲染三维场景导致崩溃的优化思路跟过程

一、计算机配置

硬件参数
内存64G
CPU13代 i5
显卡英伟达 3090 (24G显存)

二、问题描述

通过Cesium做三维场景有个通病(也可能是学艺不精),就是加载了大量模型后,如果不做优化,或者不优化模型的加载策略就会导致崩溃。

崩溃发生在做某项操作的时候,或是长时间不操作,比如72小时不操作,也会自然崩溃。这种崩溃不是必现的。

崩溃类型有两种:

  • 爆内存
  • 爆显存

三、 排查问题思路

1. 思路主要是围绕: 如何降低内存跟显存的消耗为切入点

2. 主要两个方向

  • postRender(执行频率很高)
  • 优化模型或优化模型的加载策略

3. 效果

Plan A:通过实践,优化 postRender 执行的频率确实有一点用,就是防抖嘛,但是如果执行频率太低又会导致场景更新不及时,所以这部分的优化是局限的,而且并不解决问题。

那就只能把解决问题的核心思路放到 Plan B 对模型优化了

四、 通过优化模型对项目进行优化

优化模型有两个方向(两条腿):

  • 一条腿是走:对模型本身做轻量化处理的路线(让专业的人搞就行了,俺也不用太操心)
  • 另一条腿:优化模型的加载策略(这个方向是我要做的,这个俺专业,毕竟攻城狮嘛)
模型的状况
项目数量
大模型
小模型
开干开干👇
ID待优化方案效果
1模型一股脑全部加载,导致计算机一瞬间的负荷太大,增加崩溃的风险这个好办,那就分批加载保证首屏不会崩溃
2模型全量,全局加载模型按需加载,只显示当前需要显示的模型内存降低30% - 50%,模型加载的少了,显存的消耗也就降下来了,崩溃问题的解决也是水到渠成
3大量小模型替换为小图标有效果,指标无法量化
4影像图层不是每个场景都需要图层按需加载有效果,指标无法量化
5postRender 优化降低执行频率有效果,指标无法量化

我发现 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 的缓存机制是什么样的,欢迎大佬讨论交流。

六、 Over 👍