地形渲染之地形切换用户体验优化
地形切换存在闪烁问题,如从平面地形切换到3D地形球面会重新构建出现空球的闪烁问题,如下如所示。
为什么在切换过程中会导致球面瓦片没有渲染?
在GlobeSurfaceTileProvider的terrainProvider更改的时候,假设初始化球时,没有设置地形,那么默认的terrainProvider是EllipsoidTerrainProvider,即简单的平面地形。然后通过交互的方式添加地形,添加地形代码如下:
下面展示一些 内联代码片
。
viewer.terrainLayers.addTerrainProvider(
new Cesium.CesiumTerrainProvider({
url: "../data/terrain/",
})
)
此时的terrainProvider的ready是false,在源代码中有一句注释
“Nothing to do until the provider is ready”
这就导致地形数据源发生变化的时候,有那么1-2秒的时间球是没有渲染的。因为根本就没有需要渲染的地形瓦片绘制指令。
如果想要优化此不友好的体验效果,应该如何优化?
解决方案:
在每一次释放所有瓦片的时候,先判断当前的terrainProvider的ready值是否为true,是则保持原来的执行流程;否就拷贝另存上一帧渲染的所有的瓦片。
然后在渲染的时候,同样判断terrainProvider的ready值是否为true,是则保持原来的执行流程;否就渲染拷贝的瓦片。
详细代码实现如下:
在QuadtreePrimitive.js文件中
第一步:在构造方法中添加如下四个属性
//上一帧0级瓦片
this._levelZeroTilesOld = [];
//存储上一帧渲染的瓦片
this._tilesToRenderOld = [];
//是否释放所有备份瓦片
this._freeAllBakTiles = false;
//0级瓦片是否准备
this