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
};
}