> 文章列表 > cesium EntityCollection.add方法引起的事件逻辑

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

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

介绍

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

GeometryVisualizerner内部构成

GeometryVisualizer// 重要成员this._primitives = scene.primitives;this._groundPrimitives = scene.groundPrimitivesthis._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等待渲染。