Optimise garbage collection in directional shadow shader apply

This commit is contained in:
Pyogenics
2025-08-03 21:24:25 +01:00
parent 533220281f
commit 82f07dd5ea

View File

@@ -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.<Number> = new Vector.<Number>(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];;
}
}
}