cesium Entity与Primitive效率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cesium Entity与Primitive效率相关的知识,希望对你有一定的参考价值。

参考技术A 对于创建他们的话,我想看本文章的坑定非常了解了。对象是存在map._viewer.entities中的。对于点击事件的效率是可以的,比如点击对象使其高亮。但是entity到达一定数目,且鼠标事件变成了Hover后,他每时每刻都在改变高亮对象,就会造成卡顿、延迟。是应为cesium对entity封装了较多的对象以及功能。解决办法是用更加底层的primitive。它的效果会更加好,如果你想对每个对象都分离显示不同效果。注意不要融合primitive,因为融合后所有的只能根据id来进行修改且不读到其他的自定义属性。

这样鼠标Hover事件效率就会大大提升。

cesium 绘制primitive流程(三)执行渲染命令过程

参考技术A 我们从下面图片去观察cesium是怎样执行primitive的渲染命令的

1,初始化cesium场景时候会默认执行CesiumWidget类里面的startRenderLoop方法,该方法的作用是

调用浏览器requestAnimationFrame方法循环执行widget.render方法进行渲染,我们再看看

CesiumWidget里面的rander方法,这个方法调用了scene.initializeFrame()进行初始化一帧,Clock.tick()方法触发时钟更新当前时间,Scene.render方法进行渲染。我们再看看Scene.render方法

该方法大致做了以下几件事,更新帧数,预先更新3dtiles数据,预先更新相机飞行的3dtiles数据,调用render方法等

我们看看Scene.render方法,该方法内部调用Scene.updateAndExecuteCommands方法

Scene.prototype.updateAndExecuteCommands方法根据frameState.mode变量判断是否是3d场景然后执行executeCommandsInViewport方法渲染视口内的图元,

调用Scene类里的executeCommands方法执行绘制命令

executeCommands方法内先执行和环境相关的,例如天空盒,太阳,月亮等渲染指令。

接着根据遍历视锥体数组,依次执行单个视锥体的渲染命令。

先Pass.GLOBE(椭球体),接着Pass.TERRAIN_CLASSIFICATION(贴地形),接着Pass.CESIUM_3D_TILE(3dtiles),Pass.CESIUM_3D_TILE_CLASSIFICATION(贴着3dtiles),接着Pass.CESIUM_3D_TILE_CLASSIFICATION_IGNORE_SHOW,接着Pass.OPAQUE(不透明的),Pass.TRANSLUCENT(透明的),Pass.OVERLAY(遮盖物)

然后会触发DrawCommand.prototype.execute方法

进入Centext.draw方法

该方法先设置帧缓冲区,渲染状态,uniform变量,然后调用beginDraw方法

在beginDraw方法绑定帧缓冲区,应用渲染状态(例如开启深度测试,模板测试,混合等),绑定着色程序,并限制最大纹理单元数量。

然后执行continueDraw方法

设置模型矩阵,设置uniform变量,绑定顶点数组,根据绘制的实例数量和是否有顶点索引来决定使用context._gl.drawElements,context.glDrawElementsInstanced,context._gl.drawArrays,context.glDrawArraysInstanced其中一种方法

以上是关于cesium Entity与Primitive效率的主要内容,如果未能解决你的问题,请参考以下文章

Cesium开发高级篇 02材质设置

Cesium原理篇:Batch

Cesium Primitive API 实践:绘制一个三角形

Cesium通过加载geoserver发布的数据进行渲染水面(Primitive方式)

cesium 绘制primitive流程(三)执行渲染命令过程

Cesium快速上手10-Viewer Entities组合