From 22dba410ad821055f4b25623f0a1bcf906c15691 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Fri, 8 Jul 2022 09:47:25 +0200 Subject: [PATCH] Release canvas memory when no longer needed --- src/ol/VectorRenderTile.js | 6 ++++-- src/ol/dom.js | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ol/VectorRenderTile.js b/src/ol/VectorRenderTile.js index de6ac25d2e..087105a95f 100644 --- a/src/ol/VectorRenderTile.js +++ b/src/ol/VectorRenderTile.js @@ -2,7 +2,7 @@ * @module ol/VectorRenderTile */ import Tile from './Tile.js'; -import {createCanvasContext2D} from './dom.js'; +import {createCanvasContext2D, releaseCanvas} from './dom.js'; import {getUid} from './util.js'; /** @@ -154,7 +154,9 @@ class VectorRenderTile extends Tile { */ release() { for (const key in this.context_) { - canvasPool.push(this.context_[key].canvas); + const context = this.context_[key]; + releaseCanvas(context); + canvasPool.push(context.canvas); delete this.context_[key]; } super.release(); diff --git a/src/ol/dom.js b/src/ol/dom.js index 84f68d9fe9..3aa54d753b 100644 --- a/src/ol/dom.js +++ b/src/ol/dom.js @@ -40,6 +40,18 @@ export function createCanvasContext2D( ); } +/** + * Releases canvas memory to avoid exceeding memory limits in Safari. + * See https://pqina.nl/blog/total-canvas-memory-use-exceeds-the-maximum-limit/ + * @param {CanvasRenderingContext2D} context Context. + */ +export function releaseCanvas(context) { + const canvas = context.canvas; + canvas.width = 1; + canvas.height = 1; + context.clearRect(0, 0, 1, 1); +} + /** * Get the current computed width for the given element including margin, * padding and border.