three.js 隨筆 之 WebGLObjects解析

 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

		};

	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章