Skip to content

Commit

Permalink
clean up LayerManager
Browse files Browse the repository at this point in the history
  • Loading branch information
Xiaoji Chen committed Dec 13, 2019
1 parent 742cff9 commit bce6b46
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 1,824 deletions.
104 changes: 47 additions & 57 deletions modules/core/src/lib/layer-manager.js
Expand Up @@ -99,7 +99,19 @@ export default class LayerManager {

// Check if a redraw is needed
needsRedraw(opts = {clearRedrawFlags: false}) {
return this._checkIfNeedsRedraw(opts);
let redraw = this._needsRedraw;
if (opts.clearRedrawFlags) {
this._needsRedraw = false;
}

// This layers list doesn't include sublayers, relying on composite layers
for (const layer of this.layers) {
// Call every layer to clear their flags
const layerNeedsRedraw = layer.getNeedsRedraw(opts);
redraw = redraw || layerNeedsRedraw;
}

return redraw;
}

// Check if a deep update of all layers is needed
Expand Down Expand Up @@ -161,17 +173,8 @@ export default class LayerManager {
layer.context = this.context;
}

const {error, generatedLayers} = this._updateLayers({
oldLayers: this.layers,
newLayers
});

this.layers = generatedLayers;
this._updateLayers(this.layers, newLayers);

// Throw first error found, if any
if (error) {
throw error;
}
return this;
}

Expand All @@ -182,7 +185,7 @@ export default class LayerManager {
// sublayers are rendered
const reason = this.needsUpdate();
if (reason) {
this.setNeedsRedraw(`updating layers: ${reason}`);
this._needsRedraw = this._needsRedraw || `updating layers: ${reason}`;
// Force a full update
const forceUpdate = true;
this.setLayers(this.lastRenderedLayers, forceUpdate);
Expand All @@ -193,24 +196,10 @@ export default class LayerManager {
// PRIVATE METHODS
//

_checkIfNeedsRedraw(opts) {
let redraw = this._needsRedraw;
if (opts.clearRedrawFlags) {
this._needsRedraw = false;
}

// This layers list doesn't include sublayers, relying on composite layers
for (const layer of this.layers) {
// Call every layer to clear their flags
const layerNeedsRedraw = layer.getNeedsRedraw(opts);
redraw = redraw || layerNeedsRedraw;
}

return redraw;
}

// Make a viewport "current" in layer context, updating viewportChanged flags
activateViewport(viewport) {
assert(viewport, 'LayerManager: viewport not set');

const oldViewport = this.context.viewport;
const viewportChanged = !oldViewport || !viewport.equals(oldViewport);

Expand All @@ -227,15 +216,13 @@ export default class LayerManager {
}
}

assert(this.context.viewport, 'LayerManager: viewport not set');

return this;
}

// Match all layers, checking for caught errors
// To avoid having an exception in one layer disrupt other layers
// TODO - mark layers with exceptions as bad and remove from rendering cycle?
_updateLayers({oldLayers, newLayers}) {
_updateLayers(oldLayers, newLayers) {
// Create old layer map
const oldLayerMap = {};
for (const oldLayer of oldLayers) {
Expand All @@ -250,24 +237,32 @@ export default class LayerManager {
const generatedLayers = [];

// Match sublayers
const error = this._updateSublayersRecursively({
newLayers,
oldLayerMap,
generatedLayers
});
const error = this._updateSublayersRecursively(newLayers, oldLayerMap, generatedLayers);

// Finalize unmatched layers
const error2 = this._finalizeOldLayers(oldLayerMap);

this._needsUpdate = generatedLayers.some(layer => layer.hasUniformTransition());
let needsUpdate = false;
for (const layer of generatedLayers) {
if (layer.hasUniformTransition()) {
needsUpdate = true;
break;
}
}

this._needsUpdate = needsUpdate;
this.layers = generatedLayers;

// Throw first error found, if any
const firstError = error || error2;
return {error: firstError, generatedLayers};
if (firstError) {
throw firstError;
}
}

/* eslint-disable complexity,max-statements */
// Note: adds generated layers to `generatedLayers` array parameter
_updateSublayersRecursively({newLayers, oldLayerMap, generatedLayers}) {
_updateSublayersRecursively(newLayers, oldLayerMap, generatedLayers) {
let error = null;

for (const newLayer of newLayers) {
Expand Down Expand Up @@ -309,11 +304,7 @@ export default class LayerManager {
}

if (sublayers) {
const err = this._updateSublayersRecursively({
newLayers: sublayers,
oldLayerMap,
generatedLayers
});
const err = this._updateSublayersRecursively(sublayers, oldLayerMap, generatedLayers);
error = error || err;
}
}
Expand All @@ -328,7 +319,8 @@ export default class LayerManager {
for (const layerId in oldLayerMap) {
const layer = oldLayerMap[layerId];
if (layer) {
error = error || this._finalizeLayer(layer);
const err = this._finalizeLayer(layer);
error = error || err;
}
}
return error;
Expand All @@ -338,17 +330,16 @@ export default class LayerManager {

// Initializes a single layer, calling layer methods
_initializeLayer(layer) {
let error = null;
try {
layer._initialize();
layer.lifecycle = LIFECYCLE.INITIALIZED;
} catch (err) {
log.warn(`error while initializing ${layerName(layer)}\n`, err)();
error = error || err;
return err;
// TODO - what should the lifecycle state be here? LIFECYCLE.INITIALIZATION_FAILED?
}

return error;
return null;
}

_transferLayerState(oldLayer, newLayer) {
Expand All @@ -362,30 +353,29 @@ export default class LayerManager {

// Updates a single layer, cleaning all flags
_updateLayer(layer) {
let error = null;
try {
layer._update();
} catch (err) {
log.warn(`error during update of ${layerName(layer)}`, err)();
// Save first error
error = err;
return err;
}
return error;
return null;
}

// Finalizes a single layer
_finalizeLayer(layer) {
assert(layer.lifecycle !== LIFECYCLE.AWAITING_FINALIZATION);
this._needsRedraw = this._needsRedraw || `finalized ${layerName(layer)}`;

layer.lifecycle = LIFECYCLE.AWAITING_FINALIZATION;
let error = null;
this.setNeedsRedraw(`finalized ${layerName(layer)}`);

try {
layer._finalize();
layer.lifecycle = LIFECYCLE.FINALIZED;
} catch (err) {
log.warn(`error during finalization of ${layerName(layer)}`, err)();
error = err;
return err;
}
layer.lifecycle = LIFECYCLE.FINALIZED;
return error;
return null;
}
}
2 changes: 1 addition & 1 deletion modules/core/src/lib/layer.js
Expand Up @@ -213,7 +213,7 @@ export default class Layer extends Component {
return (
coordinateSystem === COORDINATE_SYSTEM.DEFAULT ||
coordinateSystem === COORDINATE_SYSTEM.LNGLAT ||
coordinateSystem === COORDINATE_SYSTEM.IDENTITY
coordinateSystem === COORDINATE_SYSTEM.CARTESIAN
);
}

Expand Down
39 changes: 38 additions & 1 deletion test/bench/layer.bench.js
Expand Up @@ -22,7 +22,7 @@
import * as data from 'deck.gl-test/data';

import {LayerManager, MapView, DeckRenderer} from '@deck.gl/core';
import {ScatterplotLayer} from '@deck.gl/layers';
import {ScatterplotLayer, GeoJsonLayer} from '@deck.gl/layers';
import {gl} from '@deck.gl/test-utils';

// import {testInitializeLayer} from '@deck.gl/test-utils';
Expand Down Expand Up @@ -79,6 +79,43 @@ export default function layerBench(suite) {
onViewportActive: layerManager.activateViewport
});
})
.add(
'initialize layers - composite',
() => {
// clean up
layerManager.setLayers([]);
},
() => {
testIdx++;
layerManager.setLayers(
Array.from(
{length: 100},
(_, i) =>
new GeoJsonLayer({
id: `test-${testIdx}-geojson-layer-${i}`,
data: data.geojson,
stroked: true,
filled: true
})
)
);
}
)
.add('update layers - composite', () => {
const newData = {...data.geojson};
layerManager.setLayers(
Array.from(
{length: 100},
(_, i) =>
new GeoJsonLayer({
id: `test-${testIdx}-geojson-layer-${i}`,
data: newData,
stroked: true,
filled: true
})
)
);
})
.add('encoding picking color', () => {
testIdx++;
if ((testIdx + 1) >> 24) {
Expand Down

0 comments on commit bce6b46

Please sign in to comment.