From 82f07dd5eaf9879f7c23ff5953a50a5c273fd089 Mon Sep 17 00:00:00 2001 From: Pyogenics Date: Sun, 3 Aug 2025 21:24:25 +0100 Subject: [PATCH] Optimise garbage collection in directional shadow shader apply --- .../shadows/DirectionalShadowRenderer.as | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/alternativa/engine3d/shadows/DirectionalShadowRenderer.as b/src/alternativa/engine3d/shadows/DirectionalShadowRenderer.as index cf8dda1..7fb95c9 100644 --- a/src/alternativa/engine3d/shadows/DirectionalShadowRenderer.as +++ b/src/alternativa/engine3d/shadows/DirectionalShadowRenderer.as @@ -26,6 +26,7 @@ package alternativa.engine3d.shadows import flash.display3D.textures.Texture; import flash.geom.Matrix3D; import flash.geom.Vector3D; + import flash.utils.Dictionary; use namespace alternativa3d; @@ -46,6 +47,8 @@ package alternativa.engine3d.shadows private static const localToGlobal:Transform3D = new Transform3D(); private static const vector:Vector. = new Vector.(16,false); + + private static const indexedVariableNameCache:Object = {}; public var offset:Vector3D = new Vector3D(); @@ -440,17 +443,32 @@ package alternativa.engine3d.shadows alternativa3d::copyMatrixFromTransform(objectToShadowMap,localToGlobal); objectToShadowMap.append(this.name_UK); objectToShadowMap.copyRawDataTo(vector,0,true); - drawUnit.alternativa3d::setVertexConstantsFromVector(program.vertexShader.getVariableIndex(index + "cTOSHADOW"),vector,4); - drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex(index + "cConstants"),constants,1); - if(program.fragmentShader.containsVariable(index + "cShadowColor")) + drawUnit.alternativa3d::setVertexConstantsFromVector(program.vertexShader.getVariableIndex(getIndexedVariableName("cTOSHADOW", index)),vector,4); + drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex(getIndexedVariableName("cConstants", index)),constants,1); + if(program.fragmentShader.containsVariable(getIndexedVariableName("cShadowColor", index))) { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex(index + "cShadowColor"),camera.alternativa3d::ambient[0] / 2,camera.alternativa3d::ambient[1] / 2,camera.alternativa3d::ambient[2] / 2,1); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex(getIndexedVariableName("cShadowColor", index)),camera.alternativa3d::ambient[0] / 2,camera.alternativa3d::ambient[1] / 2,camera.alternativa3d::ambient[2] / 2,1); } if(this.name_M > 0) { drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex("cDPCF0"),this.pcfOffsets,this.pcfOffsets.length / 4); } - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex(index + "sSHADOWMAP"),this.shadowMap); + drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex(getIndexedVariableName("sSHADOWMAP", index)),this.shadowMap); + } + + // This helps improve garbage collection costs by caching common strings, this led to a ~6% improvement in frametime budget + private static function getIndexedVariableName(name:String, index:int):String + { + if (!indexedVariableNameCache.hasOwnProperty(name)) + { + indexedVariableNameCache[name] = {}; + } + var indexedNames:Object = indexedVariableNameCache[name]; + if (!indexedNames.hasOwnProperty(index)) + { + indexedNames[index] = index + name; + } + return indexedNames[index];; } } }