Nginx替换IIS发布静态服务,并且开启gzip压缩设置

Cesium倾斜影像加载优化 - 图1

  1. 默认 保留原始纹理格式(osgb里一般默认是jpg)

  2. 减小总量 纹理格式输出为webp

    最大的减小纹理传输数据量,比jpg压缩还会少20%,但是不减小显存消耗

  1. 减小显存 纹理格式输出 ktx (实际是dxt压缩)

    减小显存消耗,但是纹理存储数据量会增加到4倍左右

  1. 综合优化 纹理格式输出crn (基于dxt之上的二次压缩)

    减小显存消耗,纹理存储接近默认的方式

Cesium倾斜影像加载优化 - 图2

1、三角网压缩(draco)

draco压缩是一种非常高效的压缩方式,同一数据源,默认处理为70G,开启 draco压缩为37G 。但是注意压缩率并不是 70:37,因为draco 只针对顶点数据,这两个值还包含纹理数据(大约为30G),所以实际的压缩率为(70-30):(37-30)。 可见这个压缩率还是挺高的。
结论是:如果数据最终是公网发布的,那么还是要做下draco压缩,大大节省带宽(50%左右)。但是如果是本地局域网,可以不做压缩,因为压缩为有损压缩,数据质量会降,降低的不明显。
如果既要保证原始原始质量,又要公网发布,那么一定开起公网服务器的 gzip压缩,能节省(20%左右的带宽)

2、纹理压缩方式

上述的70G数据,开起draco+webp之后为31G,也就是做了webp压缩,比原始不压缩的纹理小了6G, 原始为30G, 压缩率为 30:(30-6) 差不多相交默认(jpg)节省 16% 左右的纹理,这也是webp的优势。
如果数据总量较小的前提下,又是公网传输,我们只考虑传输效率,那么做下webp压缩,进一提升数据加载速度
如果数据总量较大,那么无论是否是公网传输,我们第一位考虑的就是系统稳定性,那么尽可能的节省资源,最好做crn压缩。
但是这块又有个比较尴尬的问题,crn的压缩实在是慢,1024*1024的crn的压缩速度在秒级,数据较大的情况下,这个处理速度的是个灾难,关于这个我们未来会给出解决方案,敬请期待。

3、海量模式

海量模式其实做了两个事情:1,合并顶层块 + json分离。当然json分离我前面也提到了它的影响。下面我们主要说合并顶层块。
合并顶层块这个主要针对的Tile目录过多的情况下,一般大于8个还是有必要合并一下的,当然现在也见过一些倾斜生产的软件,输出的本身Tile个数不是太多,那么这种实际没必要合并。
如果顶层块太多,但是不合并,那么带来的问题就是顶层类似马赛克一样刷新显示,而且资源得到不释放,比如上述的示例数据有970块,假设这些块每个的纹理是1M(大约512512)纹理,那么这个就是很可观的资源浪费。而且一旦显示顶层层级,cesium的command过多,也会很卡。
目前我们合并速度还是比较慢,大约合并重建一个块需要30s,比如上述970个Tile块,那么待合并的顶层块有1/3左右,也就是330多个块,那么需要的时间大约为 (330
30 s)=170分钟左右,这个速度未来我们也会优化,给出加速方案。

影响加载效率的关键参数:

1、maximumScreenSpaceError

这个参数默认是16,只要是lab输出的数据,我们已经考虑这个默认值了,所以一般情况下,不需要修改。

2、skipLevelOfDetail

这个参数默认值是 true,是Cesium在1.5x 引入的一个优化参数,这个参数在金字塔数据加载中,可以跳过一些级别,这样整体的效率会高一些,数据占用也会小一些。
但是带来的异常是:1) 加载过程中闪烁,看起来像是透过去了,数据载入完成后正常。2,有些异常的面片,这个还是因为两级LOD之间数据差异较大,导致的。
当这个参数设置false,两级之间的变化更平滑,不会跳跃穿透,但是清晰的数据需要更长,而且还有个致命问题,一旦某一个tile数据无法请求到或者失败,导致一直不清晰。
所以我们建议:对于网络条件好,并且数据总量较小的情况下,可以设置false,提升数据显示质量。

3、preferLeaves

这个参数默认是false,同等条件下,叶子节点会优先加载。但是Cesium的tile加载优先级有很多考虑条件,这个只是其中之一,如果skipLevelOfDetail=false,这个参数几乎无意义。所以要配合skipLevelOfDetail=true来使用,此时设置preferLeaves=true。这样我们就能最快的看见符合当前视觉精度的块,对于提升大数据以及网络环境不好的前提下有一点点改善意义。

4、maximumMemoryUsage

这个参数默认是512,也即是当几何体和纹理资源大于512MB的时候,Cesium就会淘汰掉当前帧中没有visited的所有块,这个值其实很小,也是cesium为了避免资源占用过高的一个保障,不过上述我们也估算过最差情况下,没有做纹理crn压缩的情况下,这个值很容易被超过,导致很多人误以为cesium的淘汰没有效果。这个值如果设置的过小,导致cesium几乎每帧都在尝试淘汰数据,增加了遍历的时间,也同时增加了崩溃的风险。这个值如果设置的过大,cesium的淘汰机制失效,那么容易导致显存超过显卡内存,也会导致崩溃。这个值应该处于最差视角下资源占用 和 显存最大量之间。
结论:这个参数要根据当前显卡显存来配置,如果我们场景只显示这一个倾斜数据,这个可以设置到显存的50%左右,比如我的显存是6G,这个可以设置到3000左右。那么既保证不超过显存限制,又可以最大利用显存缓存,配合crn压缩之后,这个几乎可以保证你第二次查看倾斜同一位置的时候,看不到加载过程,非常棒。