Skip to content

Commit 5e431fd

Browse files
authored
WebGLPrograms: Use Map for O(1) program lookup. (mrdoob#32463)
1 parent 1657e1e commit 5e431fd

File tree

1 file changed

+10
-16
lines changed

1 file changed

+10
-16
lines changed

src/renderers/webgl/WebGLPrograms.js

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)