From 8be10756db1c9ef732699607aaefe3effbb1f935 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Fri, 22 Jun 2018 12:55:54 -0700 Subject: [PATCH] Use updateData instead of re-creating buffers for repopulated paint arrays. Fixes issue #6839 (memory leak on frequent calls to setFeatureState). The leak was caused by mismatched calls to "createVertexBuffer" and "destroy". Improves performance of PaintStates benchmark. The performance improvement is presumably because we're able to take advantage of the DYNAMIC_DRAW option intended for frequently updated buffers. --- src/data/program_configuration.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/data/program_configuration.js b/src/data/program_configuration.js index 9e0d9e0512d..bb3eb38ae7e 100644 --- a/src/data/program_configuration.js +++ b/src/data/program_configuration.js @@ -185,7 +185,11 @@ class SourceExpressionBinder implements Binder { upload(context: Context) { if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { - this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { + this.paintVertexBuffer.updateData(this.paintVertexArray); + } else { + this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + } } } @@ -280,7 +284,11 @@ class CompositeExpressionBinder implements Binder { upload(context: Context) { if (this.paintVertexArray && this.paintVertexArray.arrayBuffer) { - this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + if (this.paintVertexBuffer && this.paintVertexBuffer.buffer) { + this.paintVertexBuffer.updateData(this.paintVertexArray); + } else { + this.paintVertexBuffer = context.createVertexBuffer(this.paintVertexArray, this.paintVertexAttributes, this.expression.isStateDependent); + } } }