Ver Fonte

WebGLPrograms: Use Map for O(1) program lookup. (#32463)

mrdoob há 5 meses atrás
pai
commit
5e431fdbef
1 ficheiros alterados com 10 adições e 16 exclusões
  1. 10 16
      src/renderers/webgl/WebGLPrograms.js

+ 10 - 16
src/renderers/webgl/WebGLPrograms.js

@@ -13,6 +13,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 	const _customShaders = new WebGLShaderCache();
 	const _activeChannels = new Set();
 	const programs = [];
+	const programsMap = new Map();
 
 	const logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;
 
@@ -589,29 +590,19 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 
 	function acquireProgram( parameters, cacheKey ) {
 
-		let program;
+		let program = programsMap.get( cacheKey );
 
-		// Check if code has been already compiled
-		for ( let p = 0, pl = programs.length; p < pl; p ++ ) {
+		if ( program !== undefined ) {
 
-			const preexistingProgram = programs[ p ];
+			++ program.usedTimes;
 
-			if ( preexistingProgram.cacheKey === cacheKey ) {
-
-				program = preexistingProgram;
-				++ program.usedTimes;
-
-				break;
-
-			}
-
-		}
-
-		if ( program === undefined ) {
+		} else {
 
 			program = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );
 			programs.push( program );
 
+			programsMap.set( cacheKey, program );
+
 		}
 
 		return program;
@@ -627,6 +618,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 			programs[ i ] = programs[ programs.length - 1 ];
 			programs.pop();
 
+			// Remove from map
+			programsMap.delete( program.cacheKey );
+
 			// Free WebGL resources
 			program.destroy();
 

粤ICP备19079148号