three.js场景中每个实体都会被WebGLObjects处理,这其中就有一个判断不太引人注意,但是比较有用,
if ( updateList[ buffergeometry.id ] !== frame ) //如果多个mesh使用相同的geometry,则每帧只需要更新一次
///该类只是一个检查类,用来检查所有的数据是否都已经创建了ebo、vbo等信息,
function WebGLObjects( geometries, info ) {
//每一个对象的geometry都会放到更新列表当中
//如果多个mesh使用相同的geometry,则只需要更新一次
var updateList = {};
function update( object ) {
//获取帧的计数(从程序开始的帧为0)
var frame = info.render.frame;
//对象的几何信息
var geometry = object.geometry;
//获取geometries中缓存的object的geometry,与传入的参数geometry基本是一个东西
var buffergeometry = geometries.get( object, geometry );
// Update once per frame
//每一帧都检查是不是geometry中的数据改变了,如果改变了就要更新vbo
if ( updateList[ buffergeometry.id ] !== frame ) { //如果多个mesh使用相同的geometry,则只需要更新一次
if ( geometry.isGeometry ) { //如果是geometry需要转换为buffergeometry
buffergeometry.updateFromObject( object );
}
//更新如果vbo没有创建 或者 geometry中的数据改变了,就更新geometry对应的vbo
geometries.update( buffergeometry );
//同步帧
updateList[ buffergeometry.id ] = frame;
}
//返回geometry
return buffergeometry;
}
//程序退出时清空
function dispose() {
updateList = {};
}
//返回的接口
return {
update: update,
dispose: dispose
};
}