对于有倾斜摄影的 3D 场景来说,我们需要优先排除是由于倾斜摄影造成的卡顿。一般 3dtiles 顶层的 Tile 过多时可能会造成渲染的卡顿,文件夹内容下图所示:
这一级别的文件夹如果过多则会直接导致 Drawcall 的过多,此时需要在 OSGB 转成 3dtiles 时进行顶层重建,顶层重建会对所有 tile 生成一个整体的父类,这样在大场景的情况下可以大幅减少 Drawcall,提升渲染速度。
如果大家使用 GISBox 将 OSGB 转换为 3dtiles,那么转换时勾选重建顶层即可,具体如下图所示:
除了倾斜摄影以外,大部分的运行时卡顿都是由 3d 元素导致的。而 3d 导致的运行时卡顿情况繁多,也是最难排查的,对于 3D 场景来说,首先我们需要调出我们的 3D 调试窗,只要当前选择的是 3d 场景,同时按说 ctrl+.即可调出调试窗:
如下图所示:
一般来说当 drawcall 高于 1000 时则是显著过多了,当然对于性能比较差一些的电脑,可能几百也是很多,所以我们第一步就是优化 drawcalls 的数量
优化 drawcalls 的数量可以根据以下顺序进行排查:
相同物体关联复制是最快速降低 drawcalls,并且完全不会影响画面质量的方式,因此推荐大家优先处理,这里以 blender 为例来说明关联复制的方法:
如图所示,一个工厂内有很多的设备是完全一致的:
我们在复制的时候,按住 alt+d 来复制,就可以关联复制出更多的设备。如果要检查是不是关联复制的元素,只需要选中一个元素,进入编辑状态,在右侧列表中看看相同的其他设备是不是也进入的编辑状态,如果一起进入编辑状态(如上图所示的效果),那么这些设备就都是关联复制出来的。
关联复制后会有一个限制,那就是这些复制出来的设备必须和原来的设备公用一个材质,无法单独赋予其他材质。
对于使用相同材质的物体,我们可以选中他们后按住 ctrl+J 将他们合并成一个物体,如下图所示的两堵墙,使用相同的材质,就可以帮他们合并成一个物体:
合并完成之后一定要检查下这个物体下的材质有没有变多,如果变多就代表之前两个物体的材质并不相同,一定要把材质改为相同后再合并。否则即使看上去两个物体合并成功了,最终也不会降低 drawcalls。另外如果颜色很接近的材质,最好也改成一样的材质并合并。
我们可以采用 texture atlas 技术或者 texture array 来合并不同材质的物体,或者将多个材质烘焙到一个材质之上,这个需要对 3d 软件有着更加深入的了解,也可能会造成一些材质异常,因此除非没有其他方案,不推荐轻易使用这种合并方式。
顶点数对于 FPS 的影响要比 drawcalls 的影响小很多,但当顶点数过多,如超过 100 万时,也会显著影响运行速度,此时我们就要对当前的模型进行减面。
模型减面也有很多方法,这里以 blender 为例介绍一种简单的减面方案,更多的方案大家可以根据自己建模软件的不同进行学习或者查询。
在 blender 中我们可以直接使用精简修改器对模型进行修改,调整好参数后,应用修改器即可实现减面操作。
山海鲸中有很多的视觉效果可以根据不同的情况进行调整,一般我们从以下顺序进行调整
天空中体积云对性能消耗较大,当 FPS 较低时,优先调低体积云的渲染质量和步进次数,或者直接关闭体积云:
同时也可以进一步将整个天空由动态天空改为静态天空:
并关闭环境光中的实时抓取天空的功能,可以使用环境光或者上传一张环境贴图来代替,避免背光面过暗的情况:
阴影既是影响视觉最重要的因素之一,也是影像性能最重要的因素之一,特别是在有大量树的情况下或者顶点数特别多的情况。首先,级联阴影比普通阴影质量高很多,但同时也更消耗性能,在 FPS 不足的情况下,我们首先先降低级联阴影的级联级数或者阴影分辨率到能接收到的程度:
如果 FPS 依然很低,则建议修改成普通阴影,在整个空间很大的情况下,普通阴影可能会很模糊,此时我们可以关闭控件自适应,并设置一个范围,这样只有这个范围内的物体会投射阴影,这样可以大大增强普通阴影的质量:
另外我们也可以约束当前主相机的 Z 轴范围进一步增强阴影质量,包括提高 Z 轴最小距离或者降低 Z 轴最大距离到能接受的程度:
屏幕空间反射可以增强实时反射效果,但同时也会让山海鲸 3D 引擎切换到延迟渲染管线,在一些性能较差的 GPU 上,延迟管线需要大量占用显存而导致显著卡顿,因此关闭屏幕空间反射后,可以看到 FPS 显著提升。
灯光虽然可以达到免烘焙光照的效果,并且可以提供高性能的丁达尔效应,但和屏幕空间反射一样,灯光启用时会导致山海鲸 3d 引擎自动切换成延迟渲染管线,在一些性能较差的 GPU 上,延迟管线需要大量占用显存而导致显著卡顿,因此避免使用灯光对于一些性能较差的 GPU 来说也是显著提升性能的方式之一:
泛光和辉光都可以产生溢光的效果,其中泛光适用于写实风渲染,辉光适用于科技风渲染。但当屏幕特别大的时候如 4k 甚至 8k 时,泛光和辉光就会显著影响性能,我们可以先选择降低泛光或者辉光的质量,或者进一步关闭泛光和辉光效果:
山海鲸中还有很多其他的高级特效如体积雾,自动曝光,运动模糊,环境光遮蔽,大气散射,高度雾等等。大家可以根据自己的需要,在 FPS 较低时,尽量避免使用这些特效。
3D 场景在加载页面等待时间过长:
一般是由于网络原因导致的,您主要需要检查当前客户端电脑的网络速度以及发布出这个项目连接的电脑的网络速度是否正常。
由于 3D 元素中的顶点数过多,或者材质贴图过大,导致最终模型文件较大。这样页会显著影响加载速度,此时一方面我们可以如前面章节介绍的减面或者降低贴图分辨率,也可以采用 gltf 代替 glb 来导入外部模型,因为 gltf 是分贴图加载的,同时可以调用浏览器的缓存机制,让第二次加载速度显著提升:
如果加载停在 50%后加载较慢,一般则是由于贴图过大导致场景加载较慢,此时建议降低材质贴图的大小,尽量控制在 1k 左右。