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

		};

	}

 

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