mirror of
https://github.com/MapMakersAndProgrammers/TankiOnline2.0DemoClient.git
synced 2025-10-25 17:39:09 -07:00
Optimise garbage collection in directional shadow shader apply
This commit is contained in:
@@ -26,6 +26,7 @@ package alternativa.engine3d.shadows
|
|||||||
import flash.display3D.textures.Texture;
|
import flash.display3D.textures.Texture;
|
||||||
import flash.geom.Matrix3D;
|
import flash.geom.Matrix3D;
|
||||||
import flash.geom.Vector3D;
|
import flash.geom.Vector3D;
|
||||||
|
import flash.utils.Dictionary;
|
||||||
|
|
||||||
use namespace alternativa3d;
|
use namespace alternativa3d;
|
||||||
|
|
||||||
@@ -46,6 +47,8 @@ package alternativa.engine3d.shadows
|
|||||||
private static const localToGlobal:Transform3D = new Transform3D();
|
private static const localToGlobal:Transform3D = new Transform3D();
|
||||||
|
|
||||||
private static const vector:Vector.<Number> = new Vector.<Number>(16,false);
|
private static const vector:Vector.<Number> = new Vector.<Number>(16,false);
|
||||||
|
|
||||||
|
private static const indexedVariableNameCache:Object = {};
|
||||||
|
|
||||||
public var offset:Vector3D = new Vector3D();
|
public var offset:Vector3D = new Vector3D();
|
||||||
|
|
||||||
@@ -440,17 +443,32 @@ package alternativa.engine3d.shadows
|
|||||||
alternativa3d::copyMatrixFromTransform(objectToShadowMap,localToGlobal);
|
alternativa3d::copyMatrixFromTransform(objectToShadowMap,localToGlobal);
|
||||||
objectToShadowMap.append(this.name_UK);
|
objectToShadowMap.append(this.name_UK);
|
||||||
objectToShadowMap.copyRawDataTo(vector,0,true);
|
objectToShadowMap.copyRawDataTo(vector,0,true);
|
||||||
drawUnit.alternativa3d::setVertexConstantsFromVector(program.vertexShader.getVariableIndex(index + "cTOSHADOW"),vector,4);
|
drawUnit.alternativa3d::setVertexConstantsFromVector(program.vertexShader.getVariableIndex(getIndexedVariableName("cTOSHADOW", index)),vector,4);
|
||||||
drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex(index + "cConstants"),constants,1);
|
drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex(getIndexedVariableName("cConstants", index)),constants,1);
|
||||||
if(program.fragmentShader.containsVariable(index + "cShadowColor"))
|
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)
|
if(this.name_M > 0)
|
||||||
{
|
{
|
||||||
drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex("cDPCF0"),this.pcfOffsets,this.pcfOffsets.length / 4);
|
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];;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user