- Apr 2024
-
zhuanlan.zhihu.com zhuanlan.zhihu.com
-
更新 Scene 中的 Primitive
❓我对这句表述持怀疑态度。应该是更新渲染过程,包括更新射线拾取、预加载等。
-
-
zhuanlan.zhihu.com zhuanlan.zhihu.com
-
事件机制
比较重要的点。我绘制了一个关系图来辅助理解和记忆这种设计。
-
每当 EntityCollection 有增删改变化时
❓啊?哪个变量变了?
✅原来是 EntityCollection 中的 _addedEntities、_removedEntities、_changedEntities 这仨。
-
Updater 根据不同的条件甩到 Visualizer 上不同的批次容器中的过程
🤔怎么甩的?条件是什么?批次容器有哪些?
-
_solidItems 和 _translucentItems 都是普通的数组,保存的是模块内部定义 Batch 类型的对象
🤔从何看出的?难道要调试源码才可以吗?
-
最后创建 Primitive 时所需的 GeometryInstance 的创建者
例子:createFillGeometryInstance 方法会返回一个 GeometryInstance 实例,这个实例可以用于创建 Primitive 。
-
等待 Scene 在帧渲染流程中更新 PrimitiveCollection 进而创建出 DrawCommand
🤔从哪里看出的
-
Entity 使用 Property API 去修改实体的形状、外观
🤔不知道作者是依据什么直接得出我们需要看一看 Property API 的,按我的思路来看,需要继续看 GeometryVisualizer.prototype.update 这个方法。
-
Entity 这个时候仍然是参数对象
❓不太理解,可以理解为这样吗:此时第一帧中还没有创建出 Entity 实例。还没分解为 Primitive 。
-
进一步更新 DataSourceDisplay 中所有的数据源(无论是数据源容器中的还是默认的 CustomDataSource 的)的 可视化器(Visualizer)
更新 DataSourceDisplay 中的 DataSourceCollection 和 CustomDataSource 数据源,同时更新这两个数据源所对应(绑定)的 Visualizer 可视化器。
❓疑惑: Visualizer 是与 EntityCollection 容器对象绑定的,似乎不是和数据源 CustomDataSource 绑定的,为什么源码中可以从 CustomDataSource 中获取到 Visualizer 数组。
✅解惑:好好好,我是菜狗,我又忘了在 DataSourceDisplay 原型链上有一个重要的函数 _onDataSourceAdded ,它会在 new DataSourceDisplay 时调用一次,套娃后为 CustomDataSource 实例添加(绑定)Visualizer 数组。DataSourceDisplay 也会拥有 CustomDataSource 实例,从而可以调取 Visualizer 数组。
🌟 DataSourceDisplay 来更新数据源和对应的可视化器
-
注意到 DataSourceDisplay 创建 defaultDataSource 时,它会主动调用 _onDataSourceAdded 方法
这个函数非常重要。
给 defaultDataSource 再创建一个私有的 PrimitiveCollection,塞入 DataSourceDisplay 的 PrimitiveCollection 中(好家伙,套娃是吧);重点是在 _onDataSourceAdded 方法中会紧接着调用 _visualizersCallback 方法创建 可视化器(Visualizer)
-
真正监听 Entity 变化的是通过 EntityCollection 的事件机制完成的,EntityCollection 无论发生什么变化,都会传递给 Visualizer
EntityCollection 中发生的变化都会告知给 Visualizer 。
抽象一下: A 中发生的改变都会告知给 B , A 会吧改变的事物传递给 B ,让 B 来对这个改变的事物进行处理。
疑惑:
1、是告知给 对应的 Visualizer 还是 Visualizers 数组? 2、如何告知的?
-
fireChangedEvent()
在 EntityCollection.prototype.add 方法中也必然调用一次,而这个 add 方法也就是 View.entities.add 方法。当 Viewer 实例 viewer 调用 add 方法时,也就会调用 fireChangedEvent 方法。
这个方法的主要内容是:如果collection中 _addedEntities、_removedEntities、_changedEntities这仨任意一个有改变,那么就处理一下这些变化。
对于上面提到的 add 方法,那必然会是 _addedEntities 中有了一个 entity ( push 了至少一个 Entity 实例,需要调试代码),然后 add 内部调用 fireChangedEven 根据那仨状态来触发相关事件。
-
也就是这个重要的时钟,让 Viewer 通过事件机制参与了 CesiumWidget 调度的渲染循环。
通过一个重要的函数 Viewer.prototype._onTick 和一个事件助手对象 eventHelper.add(clock.onTick, Viewer.prototype._onTick, this); 实现了 Viewer 对 CesiumWidget 渲染循环过程的介入。
介入内容在 Viewer.prototype._onTick 方法中: 1、获取当前时间: 首先,从时钟对象中获取当前时间。
2、更新数据源显示: 然后,调用 _dataSourceDisplay.update 方法来更新数据源的显示状态,并根据返回值更新时钟视图模型的动画状态。
3、更新实体视图: 如果存在实体视图 (entityView),则检查是否有被跟踪的实体 (trackedEntity)。如果有,则获取该实体的边界球状态,并根据状态更新实体视图。
4、处理选中实体: 如果存在选中的实体 (selectedEntity) 并且启用了信息或选择功能 (_enableInfoOrSelection),则执行以下操作: 获取选中实体的边界球状态,如果获取成功则获取边界球的中心作为相机的位置。 更新相机的使能状态,使其为真(true)表示相机可用。 更新选择指示器视图模型 (selectionIndicatorViewModel),设置位置并根据相机的使能状态来显示选择指示器。 更新信息框视图模型 (infoBoxViewModel),设置显示信息、相机的使能状态以及是否正在跟踪相机。
5、处理信息框: 最后,根据是否有选中实体,更新信息框的标题和描述信息。
-
每一帧渲染调度函数中 跳动
如何准确的在每一帧中跳动?因为每一帧都会调用一次 CesiumWidget.prototype.render 。
-
Visualizer 在创建的时候
什么时候创建的,哦!在 new DataSourceDisplay 时创建了一个 _visualizers ,这是一个 Visualizer 数组。
_onDataSourceAdded:在 new DataSourceDisplay 时,会主动执行一次 _onDataSourceAdded ,这个方法搞了一个 primitiveCollection 套娃后调用了 DataSourceDisplay 她自身的 _visualizersCallback 方法(这个方法最终会是 defaultVisualizersCallback 或者自定义回调函数),这个方法会返回一个 Visualizer 数组,然后赋给 _visualizers 属性。至此,DataSourceDisplay 实例就有了 Visualizer 实例小弟了。
-
dataSource._visualizers = this._visualizersCallback
在 DataSourceDisplay 实例中创建可视化器
-
-
www.bilibili.com www.bilibili.com
-
动态
ヾ(≧▽≦*)o
-
-
www.cnblogs.com www.cnblogs.com
-
Cesium内部通过事件的机制,在DataSourceDisplay中根据Entity类型安排具体模块
1、哪些代码体现了“事件的机制” 2、哪些代码体现了“DataSourceDisplay中根据Entity类型安排具体模块”
-