From 98ed794e2d6ce32d2ce44ea68823c65f1977624e Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Tue, 2 Dec 2025 21:44:21 +0000 Subject: [PATCH] WebGLPrograms: Use Map for O(1) program lookup. --- src/renderers/webgl/WebGLPrograms.js | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/renderers/webgl/WebGLPrograms.js b/src/renderers/webgl/WebGLPrograms.js index 073f503a4598b4..af4650388526ca 100644 --- a/src/renderers/webgl/WebGLPrograms.js +++ b/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();