mirror of
https://github.com/MapMakersAndProgrammers/TankiOnline2.0DemoClient.git
synced 2025-10-25 09:29:06 -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.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];;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user