Speed up geometry rendering with VML by replacing string concatenation by array

concatenation and joining. Thanks tschaub for the patch optimization and
review. (Closes #1095)



git-svn-id: http://svn.openlayers.org/trunk/openlayers@5392 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Frédéric Junod
2007-12-13 10:24:51 +00:00
parent 8f1bca93b1
commit 7063cdab3a
+33 -30
View File
@@ -460,19 +460,18 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
this.setNodeDimension(node, geometry); this.setNodeDimension(node, geometry);
var resolution = this.getResolution(); var resolution = this.getResolution();
var numComponents = geometry.components.length;
var parts = new Array(numComponents);
var path = "m"; var comp, x, y;
for (var i = 0; i < geometry.components.length; i++) { for (var i = 0; i < numComponents; i++) {
var x = (geometry.components[i].x/resolution); comp = geometry.components[i];
var y = (geometry.components[i].y/resolution); x = (comp.x/resolution);
path += " " + x.toFixed() + "," + y.toFixed() + " l "; y = (comp.y/resolution);
parts[i] = " " + x.toFixed() + "," + y.toFixed() + " l ";
} }
if (closeLine) { var end = (closeLine) ? " x e" : " e";
path += " x"; node.path = "m" + parts.join("") + end;
}
path += " e";
node.path = path;
}, },
/** /**
@@ -488,23 +487,25 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
var resolution = this.getResolution(); var resolution = this.getResolution();
var path = ""; var path = [];
var linearRing, i, comp, x, y;
for (var j = 0; j < geometry.components.length; j++) { for (var j = 0; j < geometry.components.length; j++) {
var linearRing = geometry.components[j]; linearRing = geometry.components[j];
path += "m"; path.push("m");
for (var i = 0; i < linearRing.components.length; i++) { for (i = 0; i < linearRing.components.length; i++) {
var x = linearRing.components[i].x / resolution; comp = linearRing.components[i];
var y = linearRing.components[i].y / resolution; x = comp.x / resolution;
path += " " + x.toFixed() + "," + y.toFixed(); y = comp.y / resolution;
path.push(" " + x.toFixed() + "," + y.toFixed());
if (i==0) { if (i==0) {
path += " l"; path.push(" l");
} }
} }
path += " x "; path.push(" x ");
} }
path += "e"; path.push("e");
node.path = path; node.path = path.join("");
}, },
/** /**
@@ -537,20 +538,22 @@ OpenLayers.Renderer.VML = OpenLayers.Class(OpenLayers.Renderer.Elements, {
var resolution = this.getResolution(); var resolution = this.getResolution();
var path = ""; var path = [];
var comp, x, y;
for (var i = 0; i < geometry.components.length; i++) { for (var i = 0; i < geometry.components.length; i++) {
var x = geometry.components[i].x / resolution; comp = geometry.components[i];
var y = geometry.components[i].y / resolution; x = comp.x / resolution;
y = comp.y / resolution;
if ((i%3)==0 && (i/3)==0) { if ((i%3)==0 && (i/3)==0) {
path += "m"; path.push("m");
} else if ((i%3)==1) { } else if ((i%3)==1) {
path += " c"; path.push(" c");
} }
path += " " + x + "," + y; path.push(" " + x + "," + y);
} }
path += " x e"; path.push(" x e");
node.path = path; node.path = path.join("");
}, },
CLASS_NAME: "OpenLayers.Renderer.VML" CLASS_NAME: "OpenLayers.Renderer.VML"