介绍
记得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方法留给另一个专题来解读。