From f924e8050e54250cbab9bceb28ce5c4ffb35985d Mon Sep 17 00:00:00 2001 From: Xun Li Date: Thu, 2 Nov 2023 16:06:13 -0700 Subject: [PATCH] improv perf Signed-off-by: Xun Li --- src/layers/src/base-layer.ts | 5 ++++- src/layers/src/geoarrow-layer/geoarrow-layer.ts | 14 +++++++------- src/utils/src/arrow-data-container.ts | 13 ++++++++----- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/layers/src/base-layer.ts b/src/layers/src/base-layer.ts index d1c2fe0a32..d298430cb2 100644 --- a/src/layers/src/base-layer.ts +++ b/src/layers/src/base-layer.ts @@ -1104,7 +1104,10 @@ class Layer { const dataUpdateTriggers = this.getDataUpdateTriggers(layerDataset); const triggerChanged = this.getChangedTriggers(dataUpdateTriggers); - if (triggerChanged && triggerChanged.getMeta) { + // NOTES: + // 1) add checker `oldLayerData`: undefined oldLayerData means this is the first time layer is rendered + // and the updateLayerMeta() has already been called in setInitialLayerConfig + if (triggerChanged && triggerChanged.getMeta && Boolean(oldLayerData)) { this.updateLayerMeta(dataContainer, getPosition); } diff --git a/src/layers/src/geoarrow-layer/geoarrow-layer.ts b/src/layers/src/geoarrow-layer/geoarrow-layer.ts index bc8d53ce25..9854d0512d 100644 --- a/src/layers/src/geoarrow-layer/geoarrow-layer.ts +++ b/src/layers/src/geoarrow-layer/geoarrow-layer.ts @@ -240,7 +240,7 @@ export default class GeoArrowLayer extends GeoJsonLayer { } renderLayer(opts) { - const {data, gpuFilter, objectHovered, mapState, interactionConfig} = opts; + const {data: dataProps, gpuFilter, objectHovered, mapState, interactionConfig} = opts; const {fixedRadius, featureTypes} = this.meta; const radiusScale = this.getRadiusScaleByZoom(mapState, fixedRadius); @@ -269,12 +269,12 @@ export default class GeoArrowLayer extends GeoJsonLayer { const pickable = interactionConfig.tooltip.enabled; const hoveredObject = this.hasHoveredObject(objectHovered); - - const deckLayers = data.data.map((d, i) => { + const {data, ...props} = dataProps; + const deckLayers = data.map((d, i) => { return new DeckGLGeoJsonLayer({ ...defaultLayerProps, ...layerProps, - ...data, + ...props, data: d, id: `${this.id}-${i}`, pickable, @@ -314,9 +314,9 @@ export default class GeoArrowLayer extends GeoJsonLayer { visible: defaultLayerProps.visible, wrapLongitude: false, data: [hoveredObject], - getLineWidth: data.getLineWidth, - getPointRadius: data.getPointRadius, - getElevation: data.getElevation, + getLineWidth: dataProps.getLineWidth, + getPointRadius: dataProps.getPointRadius, + getElevation: dataProps.getElevation, getLineColor: this.config.highlightColor, getFillColor: this.config.highlightColor, // always draw outline diff --git a/src/utils/src/arrow-data-container.ts b/src/utils/src/arrow-data-container.ts index fe2b4c9c62..46383bd1fb 100644 --- a/src/utils/src/arrow-data-container.ts +++ b/src/utils/src/arrow-data-container.ts @@ -40,7 +40,8 @@ export class ArrowDataContainer implements DataContainerInterface { _numColumns: number; _numRows: number; _fields: Field[]; - _colData: any[][]; + // cache column data to make valueAt() faster + // _colData: any[][]; constructor(data: ArrowDataContainerInput) { if (!data.cols) { @@ -55,8 +56,8 @@ export class ArrowDataContainer implements DataContainerInterface { this._numColumns = data.cols.length; this._numRows = data.cols[0].length; this._fields = data.fields || []; - // cache column data to make valueAt() faster - this._colData = data.cols.map(c => c.toArray()); + + // this._colData = data.cols.map(c => c.toArray()); } numRows(): number { @@ -68,7 +69,8 @@ export class ArrowDataContainer implements DataContainerInterface { } valueAt(rowIndex: number, columnIndex: number): any { - return this._colData[columnIndex][rowIndex]; + // return this._colData[columnIndex][rowIndex]; + return this._cols[columnIndex].get(rowIndex); } row(rowIndex: number, sharedRow?: SharedRowOptions): DataRow { @@ -82,7 +84,8 @@ export class ArrowDataContainer implements DataContainerInterface { } rowAsArray(rowIndex: number): any[] { - return this._colData.map(col => col[rowIndex]); + // return this._colData.map(col => col[rowIndex]); + return this._cols.map(col => col.get(rowIndex)); } rows(sharedRow: SharedRowOptions) {