19 Matching Annotations
  1. Apr 2024
    1. 更新 Scene 中的 Primitive

      ❓我对这句表述持怀疑态度。应该是更新渲染过程,包括更新射线拾取、预加载等。

    1. 事件机制

      比较重要的点。我绘制了一个关系图来辅助理解和记忆这种设计。

    2. 每当 EntityCollection 有增删改变化时

      ❓啊?哪个变量变了?

      ✅原来是 EntityCollection 中的 _addedEntities、_removedEntities、_changedEntities 这仨。

    3. Updater 根据不同的条件甩到 Visualizer 上不同的批次容器中的过程

      🤔怎么甩的?条件是什么?批次容器有哪些?

    4. _solidItems 和 _translucentItems 都是普通的数组,保存的是模块内部定义 Batch 类型的对象

      🤔从何看出的?难道要调试源码才可以吗?

    5. 最后创建 Primitive 时所需的 GeometryInstance 的创建者

      例子:createFillGeometryInstance 方法会返回一个 GeometryInstance 实例,这个实例可以用于创建 Primitive 。

    6. 等待 Scene 在帧渲染流程中更新 PrimitiveCollection 进而创建出 DrawCommand

      🤔从哪里看出的

    7. Entity 使用 Property API 去修改实体的形状、外观

      🤔不知道作者是依据什么直接得出我们需要看一看 Property API 的,按我的思路来看,需要继续看 GeometryVisualizer.prototype.update 这个方法。

    8. Entity 这个时候仍然是参数对象

      ❓不太理解,可以理解为这样吗:此时第一帧中还没有创建出 Entity 实例。还没分解为 Primitive 。

    9. 进一步更新 DataSourceDisplay 中所有的数据源(无论是数据源容器中的还是默认的 CustomDataSource 的)的 可视化器(Visualizer)

      更新 DataSourceDisplay 中的 DataSourceCollection 和 CustomDataSource 数据源,同时更新这两个数据源所对应(绑定)的 Visualizer 可视化器。

      ❓疑惑: Visualizer 是与 EntityCollection 容器对象绑定的,似乎不是和数据源 CustomDataSource 绑定的,为什么源码中可以从 CustomDataSource 中获取到 Visualizer 数组。

      ✅解惑:好好好,我是菜狗,我又忘了在 DataSourceDisplay 原型链上有一个重要的函数 _onDataSourceAdded ,它会在 new DataSourceDisplay 时调用一次,套娃后为 CustomDataSource 实例添加(绑定)Visualizer 数组。DataSourceDisplay 也会拥有 CustomDataSource 实例,从而可以调取 Visualizer 数组。

      🌟 DataSourceDisplay 来更新数据源和对应的可视化器

    10. 注意到 DataSourceDisplay 创建 defaultDataSource 时,它会主动调用 _onDataSourceAdded 方法

      这个函数非常重要。

      给 defaultDataSource 再创建一个私有的 PrimitiveCollection,塞入 DataSourceDisplay 的 PrimitiveCollection 中(好家伙,套娃是吧);重点是在 _onDataSourceAdded 方法中会紧接着调用 _visualizersCallback 方法创建 可视化器(Visualizer)

    11. 真正监听 Entity 变化的是通过 EntityCollection 的事件机制完成的,EntityCollection 无论发生什么变化,都会传递给 Visualizer

      EntityCollection 中发生的变化都会告知给 Visualizer 。

      抽象一下: A 中发生的改变都会告知给 B , A 会吧改变的事物传递给 B ,让 B 来对这个改变的事物进行处理。

      疑惑:

      1、是告知给 对应的 Visualizer 还是 Visualizers 数组? 2、如何告知的?

    12. fireChangedEvent()

      在 EntityCollection.prototype.add 方法中也必然调用一次,而这个 add 方法也就是 View.entities.add 方法。当 Viewer 实例 viewer 调用 add 方法时,也就会调用 fireChangedEvent 方法。

      这个方法的主要内容是:如果collection中 _addedEntities、_removedEntities、_changedEntities这仨任意一个有改变,那么就处理一下这些变化。

      对于上面提到的 add 方法,那必然会是 _addedEntities 中有了一个 entity ( push 了至少一个 Entity 实例,需要调试代码),然后 add 内部调用 fireChangedEven 根据那仨状态来触发相关事件。

    13. 也就是这个重要的时钟,让 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、处理信息框: 最后,根据是否有选中实体,更新信息框的标题和描述信息。

    14. 每一帧渲染调度函数中 跳动

      如何准确的在每一帧中跳动?因为每一帧都会调用一次 CesiumWidget.prototype.render 。

    15. Visualizer 在创建的时候

      什么时候创建的,哦!在 new DataSourceDisplay 时创建了一个 _visualizers ,这是一个 Visualizer 数组。

      _onDataSourceAdded:在 new DataSourceDisplay 时,会主动执行一次 _onDataSourceAdded ,这个方法搞了一个 primitiveCollection 套娃后调用了 DataSourceDisplay 她自身的 _visualizersCallback 方法(这个方法最终会是 defaultVisualizersCallback 或者自定义回调函数),这个方法会返回一个 Visualizer 数组,然后赋给 _visualizers 属性。至此,DataSourceDisplay 实例就有了 Visualizer 实例小弟了。

    16. dataSource._visualizers = this._visualizersCallback

      在 DataSourceDisplay 实例中创建可视化器

    1. Cesium内部通过事件的机制,在DataSourceDisplay中根据Entity类型安排具体模块

      1、哪些代码体现了“事件的机制” 2、哪些代码体现了“DataSourceDisplay中根据Entity类型安排具体模块”