 					kdKey[XMAX_INDEX] = stream.readDouble();
 					kdKey[YMAX_INDEX] = stream.readDouble();
 					kdKey[IMAX_INDEX] = stream.readFloat();
-					//trace((tileTree == metadataTiles ? "metadata tile" : "geometry tile") + " " + tileID + "[" + kdKey + "]");
-					tile = new TileDescriptor(kdKey, tileID);
-					tiles.push(tile);
+					if (debug)
+						trace((tileTree == metadataTiles ? "metadata tile" : "geometry tile") + " " + tileID + "[" + kdKey + "]");
+					tiles.push(new TileDescriptor(kdKey, tileID));
 					collectiveBounds.includeCoords(kdKey[XMIN_INDEX], kdKey[YMIN_INDEX]);
 					collectiveBounds.includeCoords(kdKey[XMAX_INDEX], kdKey[YMAX_INDEX]);
 					tileID++;

		private function decodeTileList(tileTree:KDTree, stream:ByteArray):void
		{
			var tiles:Array = []; // array of descriptor objects containing kdKey and tileID
			var tile:TileDescriptor;
		    try {
				// read tile descriptors from stream
				var tileID:int = 0;

			// poorly-performing KDTree structure due to the given ordering.
			VectorUtils.randomSort(tiles);
			// insert tileDescriptors into tree
			for each (var tile:TileDescriptor in tiles)
			{
				// insert a new node in the tree, mapping kdKey to tile
				tileTree.insert(tile.kdKey, tile);
				// save mapping from tile ID to TileDescriptor so it can be excluded later
				tileLookup.set(tileTree, tile.tileID, tile);
			}

			// collective bounds changed
