@@ -13,6 +13,7 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
1313 const _customShaders = new WebGLShaderCache ( ) ;
1414 const _activeChannels = new Set ( ) ;
1515 const programs = [ ] ;
16+ const programsMap = new Map ( ) ;
1617
1718 const logarithmicDepthBuffer = capabilities . logarithmicDepthBuffer ;
1819
@@ -589,29 +590,19 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
589590
590591 function acquireProgram ( parameters , cacheKey ) {
591592
592- let program ;
593+ let program = programsMap . get ( cacheKey ) ;
593594
594- // Check if code has been already compiled
595- for ( let p = 0 , pl = programs . length ; p < pl ; p ++ ) {
595+ if ( program !== undefined ) {
596596
597- const preexistingProgram = programs [ p ] ;
597+ ++ program . usedTimes ;
598598
599- if ( preexistingProgram . cacheKey === cacheKey ) {
600-
601- program = preexistingProgram ;
602- ++ program . usedTimes ;
603-
604- break ;
605-
606- }
607-
608- }
609-
610- if ( program === undefined ) {
599+ } else {
611600
612601 program = new WebGLProgram ( renderer , cacheKey , parameters , bindingStates ) ;
613602 programs . push ( program ) ;
614603
604+ programsMap . set ( cacheKey , program ) ;
605+
615606 }
616607
617608 return program ;
@@ -627,6 +618,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
627618 programs [ i ] = programs [ programs . length - 1 ] ;
628619 programs . pop ( ) ;
629620
621+ // Remove from map
622+ programsMap . delete ( program . cacheKey ) ;
623+
630624 // Free WebGL resources
631625 program . destroy ( ) ;
632626
0 commit comments