Sfoglia il codice sorgente

cache new DataView to increase performance

Richard Monette 7 anni fa
parent
commit
552d0ed3ff
1 ha cambiato i file con 40 aggiunte e 18 eliminazioni
  1. 40 18
      examples/js/loaders/EXRLoader.js

+ 40 - 18
examples/js/loaders/EXRLoader.js

@@ -262,17 +262,17 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 		return true;
 	}
 
-	function getChar(c, lc, inBuffer, inOffset) {
-		c = (c << 8) | parseUint8(inBuffer, inOffset);
+	function getChar(c, lc, inDataView, inOffset) {
+		c = (c << 8) | parseUint8DataView(inDataView, inOffset);
 		lc += 8;
 
 		return { c: c, lc: lc };
 	}
 
-	function getCode(po, rlc, c, lc, inBuffer, inOffset, outBuffer, outBufferOffset, outBufferEndOffset) {
+	function getCode(po, rlc, c, lc, inDataView, inOffset, outBuffer, outBufferOffset, outBufferEndOffset) {
 		if (po == rlc) {
 			if (lc < 8) {
-				var temp = getChar(c, lc, inBuffer, inOffset);
+				var temp = getChar(c, lc, inDataView, inOffset);
 				c = temp.c;
 				lc = temp.lc;
 			}
@@ -304,9 +304,18 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 	var M_OFFSET = 1 << (NBITS - 1);
 	var MOD_MASK = (1 << NBITS) - 1;
 
+	function UInt16(value) {
+		return (value & 0xFFFF);
+	};
+
+	function Int16(value) {
+		var ref = UInt16(value);
+		return (ref > 0x7FFF) ? ref - 0x10000 : ref;
+	};
+
 	function wdec14(l, h) {
-		var ls = (new Int16Array([l]))[0];
-		var hs = (new Int16Array([h]))[0];
+		var ls = Int16(l);
+		var hs = Int16(h);
 
 		var hi = hs;
 		var ai = ls + (hi & 1) + (hi >> 1);
@@ -402,8 +411,10 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 		var outBufferEndOffset = no;
 		var inOffsetEnd = parseInt(inOffset.value + (ni + 7) / 8);
 
+		var dataView = new DataView(inBuffer);
+
 		while (inOffset.value < inOffsetEnd) {
-			var temp = getChar(c, lc, inBuffer, inOffset);
+			var temp = getChar(c, lc, dataView, inOffset);
 			c = temp.c;
 			lc = temp.lc;
 
@@ -413,7 +424,7 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 
 				if (pl.len) {
 					lc -= pl.len;
-					var temp = getCode(pl.lit, rlc, c, lc, inBuffer, inOffset, outBuffer, outOffset, outBufferEndOffset);
+					var temp = getCode(pl.lit, rlc, c, lc, dataView, inOffset, outBuffer, outOffset, outBufferEndOffset);
 					c = temp.c;
 					lc = temp.lc;
 				} else {
@@ -427,7 +438,7 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 						var l = hufLength(encodingTable[pl.p[j]]);
 
 						while (lc < l && inOffset.value < inOffsetEnd) {
-							var temp = getChar(c, lc, inBuffer, inOffset);
+							var temp = getChar(c, lc, dataView, inOffset);
 							c = temp.c;
 							lc = temp.lc;
 						}
@@ -437,7 +448,7 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 								((c >> (lc - l)) & ((1 << l) - 1))) {
 
 								lc -= l;
-								var temp = getCode(pl.p[j], rlc, c, lc, inBuffer, inOffset, outBuffer, outOffset, outBufferEndOffset);
+								var temp = getCode(pl.p[j], rlc, c, lc, dataView, inOffset, outBuffer, outOffset, outBufferEndOffset);
 								c = temp.c;
 								lc = temp.lc;
 								break;
@@ -461,7 +472,7 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 
 			if (pl.len) {
 				lc -= pl.len;
-				var temp = getCode(pl.lit, rlc, c, lc, inBuffer, inOffset, outBuffer, outOffset, outBufferEndOffset);
+				var temp = getCode(pl.lit, rlc, c, lc, dataView, inOffset, outBuffer, outOffset, outBufferEndOffset);
 				c = temp.c;
 				lc = temp.lc;
 			} else {
@@ -501,13 +512,13 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 		hufBuildDecTable(freq, im, iM, hdec);
 
 		hufDecode(freq, hdec, inBuffer, inOffset, nBits, iM, nRaw, outBuffer, outOffset);
-		}
+	}
 
-		function applyLut(lut, data, nData) {
-			for (var i = 0; i < nData; ++i) {
-				data[i] = lut[data[i]];
-			}
+	function applyLut(lut, data, nData) {
+		for (var i = 0; i < nData; ++i) {
+			data[i] = lut[data[i]];
 		}
+	}
 
 	function decompressPIZ(outBuffer, outOffset, inBuffer, inOffset, tmpBufSize, num_channels, exrChannelInfos, dataWidth, num_lines) {
 		var bitmap = new Uint8Array(BITMAP_SIZE);
@@ -625,6 +636,15 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 
 	}
 
+	function parseUint8DataView( dataView, offset ) {
+
+		var Uint8 = dataView.getUint8(offset.value, true);
+
+		offset.value = offset.value + 1;
+
+		return Uint8;
+	}
+
 	function parseUint8( buffer, offset ) {
 
 		var Uint8 = new DataView( buffer.slice( offset.value, offset.value + 1 ) ).getUint8( 0, true );
@@ -885,13 +905,14 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 
 			for ( var channelID = 0; channelID < EXRHeader.channels.length; channelID ++ ) {
 
+				var cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];
+
 				if ( EXRHeader.channels[ channelID ].pixelType == 1 ) {
 
 					// HALF
 					for ( var x = 0; x < width; x ++ ) {
 
 						var val = parseFloat16( buffer, offset );
-						var cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];
 
 						byteArray[ ( ( ( width - y_scanline ) * ( height * numChannels ) ) + ( x * numChannels ) ) + cOff ] = val;
 
@@ -924,12 +945,13 @@ THREE.EXRLoader.prototype._parser = function ( buffer ) {
 
 				for ( var channelID = 0; channelID < EXRHeader.channels.length; channelID ++ ) {
 
+					var cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];
+
 					if ( EXRHeader.channels[ channelID ].pixelType == 1 ) {
 
 						// HALF
 						for ( var x = 0; x < width; x ++ ) {
 
-							var cOff = channelOffsets[ EXRHeader.channels[ channelID ].name ];
 							var val = decodeFloat16(tmpBuffer[ (channelID * (scanlineBlockSize * width)) + (line_y * width) + x ]);
 
 							var true_y = line_y + (scanlineBlockIdx * scanlineBlockSize);