浏览代码

minor optimizes

ncannasse 9 年之前
父节点
当前提交
fc691dd770
共有 2 个文件被更改,包括 55 次插入50 次删除
  1. 1 1
      h2d/col/Triangle.hx
  2. 54 49
      h3d/impl/Stage3dDriver.hx

+ 1 - 1
h2d/col/Triangle.hx

@@ -21,7 +21,7 @@ class Triangle {
 		return new Point((a.x + b.x + c.x) / 3, (a.y + b.y + c.y) / 3);
 	}
 
-	public function getArea() {
+	public inline function getArea() {
 		if( area == UNDEF ) {
 			area = ((a.y * b.x - a.x * b.y) + (b.y * c.x - b.x * c.y) + (c.y * a.x - c.x * a.y)) * -0.5;
 			invArea = 1 / area;

+ 54 - 49
h3d/impl/Stage3dDriver.hx

@@ -495,59 +495,64 @@ class Stage3dDriver extends Driver {
 		return fmt(vertex, shader.vertex) + "\n" + fmt(fragment, shader.fragment);
 	}
 
+	function initShader( shader : hxsl.RuntimeShader ) {
+		var p = new CompiledShader(shader);
+		p.p = ctx.createProgram();
+
+		var cachedShader = null;
+		var file = SHADER_CACHE_PATH;
+		if( SHADER_CACHE_PATH != null ) {
+			file += shader.signature;
+			if( !isStandardMode ) file += "1";
+			file += ".shader";
+			try cachedShader = haxe.Unserializer.run(hxd.File.getBytes(file).toString()) catch( e : Dynamic ) { };
+		}
+		if( cachedShader == null ) {
+			cachedShader = {
+				vertex : compileShader(shader.vertex,[]).bytes,
+				fragment : compileShader(shader.fragment, p.usedTextures).bytes,
+				tex : p.usedTextures,
+			};
+			if( file != null )
+				hxd.File.saveBytes(file, haxe.io.Bytes.ofString(haxe.Serializer.run(cachedShader)));
+		} else {
+			p.usedTextures = cachedShader.tex;
+		}
+
+		var vdata = cachedShader.vertex.getData();
+		var fdata = cachedShader.fragment.getData();
+		vdata.endian = flash.utils.Endian.LITTLE_ENDIAN;
+		fdata.endian = flash.utils.Endian.LITTLE_ENDIAN;
+
+		var pos = 0;
+		for( v in shader.vertex.data.vars )
+			if( v.kind == Input ) {
+				var size;
+				var fmt = switch( v.type ) {
+				case TBytes(4): size = 1; flash.display3D.Context3DVertexBufferFormat.BYTES_4;
+				case TFloat: size = 1; flash.display3D.Context3DVertexBufferFormat.FLOAT_1;
+				case TVec(2, VFloat): size = 2; flash.display3D.Context3DVertexBufferFormat.FLOAT_2;
+				case TVec(3, VFloat): size = 3; flash.display3D.Context3DVertexBufferFormat.FLOAT_3;
+				case TVec(4, VFloat): size = 4; flash.display3D.Context3DVertexBufferFormat.FLOAT_4;
+				default: throw "unsupported input " + v.type;
+				}
+				var idx = FORMAT.indexOf(fmt);
+				if( idx < 0 ) throw "assert " + fmt;
+				p.bufferFormat |= idx << (pos * 3);
+				p.inputNames.push(v.name);
+				p.stride += size;
+				pos++;
+			}
+
+		p.p.upload(vdata, fdata);
+		return p;
+	}
+
 	override function selectShader( shader : hxsl.RuntimeShader ) {
 		var shaderChanged = false;
 		var p = programs.get(shader.id);
 		if( p == null ) {
-			p = new CompiledShader(shader);
-			p.p = ctx.createProgram();
-
-			var cachedShader = null;
-			var file = SHADER_CACHE_PATH;
-			if( SHADER_CACHE_PATH != null ) {
-				file += shader.signature;
-				if( !isStandardMode ) file += "1";
-				file += ".shader";
-				try cachedShader = haxe.Unserializer.run(hxd.File.getBytes(file).toString()) catch( e : Dynamic ) { };
-			}
-			if( cachedShader == null ) {
-				cachedShader = {
-					vertex : compileShader(shader.vertex,[]).bytes,
-					fragment : compileShader(shader.fragment, p.usedTextures).bytes,
-					tex : p.usedTextures,
-				};
-				if( file != null )
-					hxd.File.saveBytes(file, haxe.io.Bytes.ofString(haxe.Serializer.run(cachedShader)));
-			} else {
-				p.usedTextures = cachedShader.tex;
-			}
-
-			var vdata = cachedShader.vertex.getData();
-			var fdata = cachedShader.fragment.getData();
-			vdata.endian = flash.utils.Endian.LITTLE_ENDIAN;
-			fdata.endian = flash.utils.Endian.LITTLE_ENDIAN;
-
-			var pos = 0;
-			for( v in shader.vertex.data.vars )
-				if( v.kind == Input ) {
-					var size;
-					var fmt = switch( v.type ) {
-					case TBytes(4): size = 1; flash.display3D.Context3DVertexBufferFormat.BYTES_4;
-					case TFloat: size = 1; flash.display3D.Context3DVertexBufferFormat.FLOAT_1;
-					case TVec(2, VFloat): size = 2; flash.display3D.Context3DVertexBufferFormat.FLOAT_2;
-					case TVec(3, VFloat): size = 3; flash.display3D.Context3DVertexBufferFormat.FLOAT_3;
-					case TVec(4, VFloat): size = 4; flash.display3D.Context3DVertexBufferFormat.FLOAT_4;
-					default: throw "unsupported input " + v.type;
-					}
-					var idx = FORMAT.indexOf(fmt);
-					if( idx < 0 ) throw "assert " + fmt;
-					p.bufferFormat |= idx << (pos * 3);
-					p.inputNames.push(v.name);
-					p.stride += size;
-					pos++;
-				}
-
-			p.p.upload(vdata, fdata);
+			p = initShader(shader);
 			programs.set(shader.id, p);
 			curShader = null;
 		}