From f010f7b9c1fccd8def87e8971d4f0a10dc013cf7 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 8 Dec 2017 09:59:20 +0100 Subject: [PATCH 1/4] Only compose image vector frame when the replay group has changed --- src/ol/renderer/canvas/imagelayer.js | 11 ++++++----- src/ol/renderer/canvas/vectorlayer.js | 8 ++++++++ test/spec/ol/renderer/canvas/vectorlayer.test.js | 8 ++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/ol/renderer/canvas/imagelayer.js b/src/ol/renderer/canvas/imagelayer.js index b9a159548c..b807dee5b6 100644 --- a/src/ol/renderer/canvas/imagelayer.js +++ b/src/ol/renderer/canvas/imagelayer.js @@ -127,8 +127,9 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye projection = sourceProjection; } } - if (this.vectorRenderer_) { - var context = this.vectorRenderer_.context; + var vectorRenderer = this.vectorRenderer_; + if (vectorRenderer) { + var context = vectorRenderer.context; var imageFrameState = /** @type {olx.FrameState} */ (ol.obj.assign({}, frameState, { size: [ ol.extent.getWidth(renderedExtent) / viewResolution, @@ -138,12 +139,12 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame = function(frameState, laye rotation: 0 })) })); - if (this.vectorRenderer_.prepareFrame(imageFrameState, layerState)) { + if (vectorRenderer.prepareFrame(imageFrameState, layerState) && vectorRenderer.replayGroupChanged) { context.canvas.width = imageFrameState.size[0] * pixelRatio; context.canvas.height = imageFrameState.size[1] * pixelRatio; - this.vectorRenderer_.composeFrame(imageFrameState, layerState, context); + vectorRenderer.composeFrame(imageFrameState, layerState, context); + this.image_ = new ol.ImageCanvas(renderedExtent, viewResolution, pixelRatio, context.canvas); } - this.image_ = new ol.ImageCanvas(renderedExtent, viewResolution, pixelRatio, context.canvas); } else { image = imageSource.getImage( renderedExtent, viewResolution, pixelRatio, projection); diff --git a/src/ol/renderer/canvas/vectorlayer.js b/src/ol/renderer/canvas/vectorlayer.js index 173bef5b37..6372dac53f 100644 --- a/src/ol/renderer/canvas/vectorlayer.js +++ b/src/ol/renderer/canvas/vectorlayer.js @@ -69,6 +69,12 @@ ol.renderer.canvas.VectorLayer = function(vectorLayer) { */ this.replayGroup_ = null; + /** + * A new replay group had to be created by `prepareFrame()` + * @type {boolean} + */ + this.replayGroupChanged = true; + /** * @type {CanvasRenderingContext2D} */ @@ -343,6 +349,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = function(frameState, lay this.renderedRevision_ == vectorLayerRevision && this.renderedRenderOrder_ == vectorLayerRenderOrder && ol.extent.containsExtent(this.renderedExtent_, extent)) { + this.replayGroupChanged = false; return true; } @@ -400,6 +407,7 @@ ol.renderer.canvas.VectorLayer.prototype.prepareFrame = function(frameState, lay this.renderedExtent_ = extent; this.replayGroup_ = replayGroup; + this.replayGroupChanged = true; return true; }; diff --git a/test/spec/ol/renderer/canvas/vectorlayer.test.js b/test/spec/ol/renderer/canvas/vectorlayer.test.js index 1a2c88a162..098622aa55 100644 --- a/test/spec/ol/renderer/canvas/vectorlayer.test.js +++ b/test/spec/ol/renderer/canvas/vectorlayer.test.js @@ -290,6 +290,14 @@ describe('ol.renderer.canvas.VectorLayer', function() { ], buffer)); }); + it('sets replayGroupChanged correctly', function() { + frameState.extent = [-10000, -10000, 10000, 10000]; + renderer.prepareFrame(frameState, {}); + expect(renderer.replayGroupChanged).to.be(true); + renderer.prepareFrame(frameState, {}); + expect(renderer.replayGroupChanged).to.be(false); + }); + }); }); From a699cc348b5c9972cbe7c98ab3ff85415296cd34 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 7 Dec 2017 09:18:11 +0100 Subject: [PATCH 2/4] Fix pull request link --- changelog/v4.6.2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/v4.6.2.md b/changelog/v4.6.2.md index fda567b3f3..464a8d02f0 100644 --- a/changelog/v4.6.2.md +++ b/changelog/v4.6.2.md @@ -4,4 +4,4 @@ The v4.6.2 release fixes a regression that could cause tremendous amounts of unn ## Fixes - * [#7546](Do not request features for wrapped extent) - Do not request features for wrapped extent ([@ahocevar](https://github.com/ahocevar)) + * [#7546](https://github.com/openlayers/openlayers/pull/7546) - Do not request features for wrapped extent ([@ahocevar](https://github.com/ahocevar)) From 3bba8ef061e11d9d389ae55e7829288156f7927f Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 8 Dec 2017 11:16:52 +0100 Subject: [PATCH 3/4] Changelog for v4.6.3 --- changelog/v4.6.3.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 changelog/v4.6.3.md diff --git a/changelog/v4.6.3.md b/changelog/v4.6.3.md new file mode 100644 index 0000000000..5aeabfa599 --- /dev/null +++ b/changelog/v4.6.3.md @@ -0,0 +1,7 @@ +# 4.6.3 + +The v4.6.3 release fixes a performance issue when `renderMode: 'image'` is set on an `ol.layer.Vector`. + +## Fixes + + * [#7554](https://github.com/openlayers/openlayers/pull/7554) - Only compose image vector frame when the replay group has changed ([@ahocevar](https://github.com/ahocevar)) From c76c445e43eafb9a4b8458776087874121251aaf Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 8 Dec 2017 11:17:36 +0100 Subject: [PATCH 4/4] Update package version to 4.6.3 --- package.json | 2 +- package/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 00ed7d5406..a01eb6c332 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openlayers", - "version": "4.6.2", + "version": "4.6.3", "description": "Build tools and sources for developing OpenLayers based mapping applications", "keywords": [ "map", diff --git a/package/package.json b/package/package.json index 158788a12e..067a6491fa 100644 --- a/package/package.json +++ b/package/package.json @@ -1,6 +1,6 @@ { "name": "ol", - "version": "4.6.2", + "version": "4.6.3", "description": "OpenLayers as ES2015 modules", "main": "index.js", "module": "index.js",