cesium EntityCollection.add方法引起的事件逻辑

介绍

记得Viewer.entities.add 可以添加Cesium中的内置的一些Entity,这个add中发什么了?这里以让GeometryVisualizerner为例,让我们看看

GeometryVisualizerner内部构成

GeometryVisualizer
  // 重要成员
  this._primitives = scene.primitives;
  this._groundPrimitives = scene.groundPrimitives
  this._entityCollection = entityCollection;
  // 重要逻辑
  entityCollection.collectionChanged.addEventListener(GeometryVisualizer.prototype._onCollectionChanged,
    this
  );
  // 重要方法
  _onCollectionChanged

逻辑分析

add=》
fireChangedEvent=》 
collection._collectionChanged.raiseEvent(collection,addedArray,removedArray,changedArray;

激活entityCollection的_collectionChanged事件,间接激活GeometryVisualizer.prototype._onCollectionChanged事件

下面就是更新addedObjects、removedObjects 、changedObjects ,后面会在每一帧调用的GeometryVisualizer.update方法里面使用到

GeometryVisualizer.prototype._onCollectionChanged = function (
  entityCollection,
  added,
  removed
) {
  var addedObjects = this._addedObjects;
  var removedObjects = this._removedObjects;
  var changedObjects = this._changedObjects;

  var i;
  var id;
  var entity;
  for (i = removed.length - 1; i > -1; i--) {
    entity = removed[i];
    id = entity.id;
    if (!addedObjects.remove(id)) {
      removedObjects.set(id, entity);
      changedObjects.remove(id);
    }
  }

  for (i = added.length - 1; i > -1; i--) {
    entity = added[i];
    id = entity.id;
    if (removedObjects.remove(id)) {
      changedObjects.set(id, entity);
    } else {
      addedObjects.set(id, entity);
    }
  }
};

结论

Viewer.entities.add逻辑执行完毕后,会更新GeometryVisualizer中的addedObjects 、removedObjects、changedObjects ,在逐帧进行的GeometryVisualizer.update方法中会根据上述信息进行下一步操作(添加、删除、更新),解析出新的primitives等待渲染。
有兴趣可以阅读Cesium原理篇:7最长的一帧之Entity(下)
,大致可以看出最终经过一系列处理还是将entity组装合批到GeometryVisualizer的_primitives中,也就是scene.primitives,在tick()后,开始的this._scene.render(currentTime)

this._scene.render(currentTime);
    Scene.prototype.render
        function render(scene, time)
            function updateAndExecuteCommands()
                function executeCommandsInViewport()
                    function updatePrimitives()
                        PrimitiveCollection.prototype.update()
                            for (var i = 0; i < primitives.length; ++i) {
                                primitives[i].update(frameState);
                            }

至于Primitive.update方法留给另一个专题来解读。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值