浏览代码

FX: Remove many allocs in ParticleInstance update()

trethaller 6 年之前
父节点
当前提交
5382ec1ce4
共有 2 个文件被更改,包括 26 次插入19 次删除
  1. 16 10
      hide/prefab/fx/Emitter.hx
  2. 10 9
      hide/prefab/fx/Evaluator.hx

+ 16 - 10
hide/prefab/fx/Emitter.hx

@@ -74,6 +74,12 @@ private class ParticleInstance extends h3d.scene.Object {
 		emitter.instances.push(this);
 		emitter.instances.push(this);
 	}
 	}
 
 
+	static var tmpRot = new h3d.Vector();
+	static var tmpOffset = new h3d.Vector();
+	static var tmpScale = new h3d.Vector();
+	static var tmpLocalSpeed = new h3d.Vector();
+	static var tmpWorldSpeed = new h3d.Vector();
+	var tmpColor = new h3d.Vector();
 	public function update(dt : Float) {
 	public function update(dt : Float) {
 		var child = getChildAt(0);
 		var child = getChildAt(0);
 		if(child == null)
 		if(child == null)
@@ -81,15 +87,15 @@ private class ParticleInstance extends h3d.scene.Object {
 
 
 		var t = hxd.Math.clamp(life / emitter.lifeTime, 0.0, 1.0);
 		var t = hxd.Math.clamp(life / emitter.lifeTime, 0.0, 1.0);
 
 
-		var localSpeed = evaluator.getVector(def.localSpeed, t);
-		if(localSpeed.length() > 0.001) {
-			localSpeed.transform3x3(orientation.toMatrix());
+		evaluator.getVector(def.localSpeed, t, tmpLocalSpeed);
+		if(tmpLocalSpeed.length() > 0.001) {
+			tmpLocalSpeed.transform3x3(orientation.toMatrix());
 		}
 		}
-		var worldSpeed = evaluator.getVector(def.worldSpeed, t);
+		evaluator.getVector(def.worldSpeed, t, tmpWorldSpeed);
 		if(emitter.simulationSpace == Local)
 		if(emitter.simulationSpace == Local)
-			worldSpeed.transform3x3(emitter.invTransform);
+			tmpWorldSpeed.transform3x3(emitter.invTransform);
 
 
-		curVelocity = localSpeed.add(worldSpeed);
+		curVelocity = tmpLocalSpeed.add(tmpWorldSpeed);
 		if(emitter.emitOrientation == Speed && curVelocity.lengthSq() > 0.01) {
 		if(emitter.emitOrientation == Speed && curVelocity.lengthSq() > 0.01) {
 			getRotationQuat().initDirection(curVelocity);
 			getRotationQuat().initDirection(curVelocity);
 			posChanged = true;
 			posChanged = true;
@@ -99,10 +105,10 @@ private class ParticleInstance extends h3d.scene.Object {
 		y += curVelocity.y * dt;
 		y += curVelocity.y * dt;
 		z += curVelocity.z * dt;
 		z += curVelocity.z * dt;
 
 
-		var rot = evaluator.getVector(def.rotation, t);
+		var rot = evaluator.getVector(def.rotation, t, tmpRot);
 		rot.scale3(Math.PI / 180.0);
 		rot.scale3(Math.PI / 180.0);
-		var offset = evaluator.getVector(def.localOffset, t);
-		var scaleVec = evaluator.getVector(def.stretch, t);
+		var offset = evaluator.getVector(def.localOffset, t, tmpOffset);
+		var scaleVec = evaluator.getVector(def.stretch, t, tmpScale);
 		scaleVec.scale3(evaluator.getFloat(def.scale, t));
 		scaleVec.scale3(evaluator.getFloat(def.scale, t));
 
 
 		childMat.initScale(scaleVec.x, scaleVec.y, scaleVec.z);
 		childMat.initScale(scaleVec.x, scaleVec.y, scaleVec.z);
@@ -123,7 +129,7 @@ private class ParticleInstance extends h3d.scene.Object {
 				case VCurve(a):
 				case VCurve(a):
 					mat.color.a = evaluator.getFloat(def.color, t);
 					mat.color.a = evaluator.getFloat(def.color, t);
 				default:
 				default:
-					mat.color = evaluator.getVector(def.color, t);
+					mat.color = evaluator.getVector(def.color, t, tmpColor);
 			}
 			}
 		}
 		}
 
 

+ 10 - 9
hide/prefab/fx/Evaluator.hx

@@ -43,28 +43,29 @@ class Evaluator {
 		return 0.0;
 		return 0.0;
 	}
 	}
 
 
-	public function getVector(v: Value, time: Float) : h3d.Vector {
+	public function getVector(v: Value, time: Float, ?vec: h3d.Vector) : h3d.Vector {
+		if(vec == null)
+			vec = new h3d.Vector();
 		switch(v) {
 		switch(v) {
 			case VMult(a, b):
 			case VMult(a, b):
 				var av = getVector(a, time);
 				var av = getVector(a, time);
 				var bv = getVector(b, time);
 				var bv = getVector(b, time);
-				return new h3d.Vector(av.x * bv.x, av.y * bv.y, av.z * bv.z, av.w * bv.w);
+				vec.set(av.x * bv.x, av.y * bv.y, av.z * bv.z, av.w * bv.w);
 			case VVector(x, y, z, null):
 			case VVector(x, y, z, null):
-				return new h3d.Vector(getFloat(x, time), getFloat(y, time), getFloat(z, time), 1.0);
+				vec.set(getFloat(x, time), getFloat(y, time), getFloat(z, time), 1.0);
 			case VVector(x, y, z, w):
 			case VVector(x, y, z, w):
-				return new h3d.Vector(getFloat(x, time), getFloat(y, time), getFloat(z, time), getFloat(w, time));
+				vec.set(getFloat(x, time), getFloat(y, time), getFloat(z, time), getFloat(w, time));
 			case VHsl(h, s, l, a):
 			case VHsl(h, s, l, a):
 				var hval = getFloat(h, time);
 				var hval = getFloat(h, time);
 				var sval = getFloat(s, time);
 				var sval = getFloat(s, time);
 				var lval = getFloat(l, time);
 				var lval = getFloat(l, time);
 				var aval = getFloat(a, time);
 				var aval = getFloat(a, time);
-				var col = new h3d.Vector(0,0,0,1);
-				col.makeColor(hval, sval, lval);
-				col.a = aval;
-				return col;
+				vec.makeColor(hval, sval, lval);
+				vec.a = aval;
 			default:
 			default:
 				var f = getFloat(v, time);
 				var f = getFloat(v, time);
-				return new h3d.Vector(f, f, f, 1.0);
+				vec.set(f, f, f, 1.0);
 		}
 		}
+		return vec;
 	}
 	}
 }
 }