Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cache serialized versions of layers #9289

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions src/data/feature_index.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ class FeatureIndex {
}

// Finds non-symbol features in this tile at a particular position.
query(args: QueryParameters, styleLayers: {[string]: StyleLayer}, sourceFeatureState: SourceFeatureState): {[string]: Array<{ featureIndex: number, feature: GeoJSONFeature }>} {
query(args: QueryParameters, styleLayers: {[string]: StyleLayer}, serializedLayers: {[string]: Object}, sourceFeatureState: SourceFeatureState): {[string]: Array<{ featureIndex: number, feature: GeoJSONFeature }>} {
this.loadVTLayers();

const params = args.params || {},
Expand Down Expand Up @@ -146,6 +146,7 @@ class FeatureIndex {
filter,
params.layers,
styleLayers,
serializedLayers,
(feature: VectorTileFeature, styleLayer: StyleLayer, id: string | number | void) => {
if (!featureGeometry) {
featureGeometry = loadGeometry(feature);
Expand All @@ -171,6 +172,7 @@ class FeatureIndex {
filter: FeatureFilter,
filterLayerIDs: Array<string>,
styleLayers: {[string]: StyleLayer},
serializedLayers: {[string]: Object},
intersectionTest?: (feature: VectorTileFeature, styleLayer: StyleLayer, id: string | number | void) => boolean | number) {

const layerIDs = this.bucketLayerIDs[bucketIndex];
Expand Down Expand Up @@ -203,7 +205,7 @@ class FeatureIndex {
}

const geojsonFeature = new GeoJSONFeature(feature, this.z, this.x, this.y, id);
(geojsonFeature: any).layer = styleLayer.serialize();
(geojsonFeature: any).layer = serializedLayers[layerID];
let layerResult = result[layerID];
if (layerResult === undefined) {
layerResult = result[layerID] = [];
Expand All @@ -219,7 +221,8 @@ class FeatureIndex {
sourceLayerIndex: number,
filterSpec: FilterSpecification,
filterLayerIDs: Array<string>,
styleLayers: {[string]: StyleLayer}) {
styleLayers: {[string]: StyleLayer},
serializedLayers: {[string]: Object}) {
const result = {};
this.loadVTLayers();

Expand All @@ -233,7 +236,8 @@ class FeatureIndex {
symbolFeatureIndex,
filter,
filterLayerIDs,
styleLayers
styleLayers,
serializedLayers
);

}
Expand Down
6 changes: 5 additions & 1 deletion src/source/query_features.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ function queryIncludes3DLayer(layers?: Array<string>, styleLayers: {[string]: St

export function queryRenderedFeatures(sourceCache: SourceCache,
styleLayers: {[string]: StyleLayer},
serializedLayers: {[string]: Object},
queryGeometry: Array<Point>,
params: { filter: FilterSpecification, layers: Array<string> },
transform: Transform) {
Expand All @@ -57,6 +58,7 @@ export function queryRenderedFeatures(sourceCache: SourceCache,
wrappedTileID: tileIn.tileID.wrapped().key,
queryResults: tileIn.tile.queryRenderedFeatures(
styleLayers,
serializedLayers,
sourceCache._state,
tileIn.queryGeometry,
tileIn.cameraQueryGeometry,
Expand Down Expand Up @@ -86,6 +88,7 @@ export function queryRenderedFeatures(sourceCache: SourceCache,
}

export function queryRenderedSymbols(styleLayers: {[string]: StyleLayer},
serializedLayers: {[string]: Object},
sourceCaches: {[string]: SourceCache},
queryGeometry: Array<Point>,
params: { filter: FilterSpecification, layers: Array<string> },
Expand All @@ -106,7 +109,8 @@ export function queryRenderedSymbols(styleLayers: {[string]: StyleLayer},
queryData.sourceLayerIndex,
params.filter,
params.layers,
styleLayers);
styleLayers,
serializedLayers);

for (const layerID in bucketSymbols) {
const resultFeatures = result[layerID] = result[layerID] || [];
Expand Down
3 changes: 2 additions & 1 deletion src/source/tile.js
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ class Tile {
// Queries non-symbol features rendered for this tile.
// Symbol features are queried globally
queryRenderedFeatures(layers: {[string]: StyleLayer},
serializedLayers: {[string]: Object},
sourceFeatureState: SourceFeatureState,
queryGeometry: Array<Point>,
cameraQueryGeometry: Array<Point>,
Expand All @@ -285,7 +286,7 @@ class Tile {
transform,
params,
queryPadding: this.queryPadding * maxPitchScaleFactor
}, layers, sourceFeatureState);
}, layers, serializedLayers, sourceFeatureState);
}

querySourceFeatures(result: Array<GeoJSONFeature>, params: any) {
Expand Down
11 changes: 11 additions & 0 deletions src/style/style.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ class Style extends Evented {
_request: ?Cancelable;
_spriteRequest: ?Cancelable;
_layers: {[string]: StyleLayer};
_serializedLayers: {[string]: Object};
_order: Array<string>;
sourceCaches: {[string]: SourceCache};
zoomHistory: ZoomHistory;
Expand Down Expand Up @@ -149,6 +150,7 @@ class Style extends Evented {
this.crossTileSymbolIndex = new CrossTileSymbolIndex();

this._layers = {};
this._serializedLayers = {};
this._order = [];
this.sourceCaches = {};
this.zoomHistory = new ZoomHistory();
Expand Down Expand Up @@ -262,10 +264,12 @@ class Style extends Evented {
this._order = layers.map((layer) => layer.id);

this._layers = {};
this._serializedLayers = {};
for (let layer of layers) {
layer = createStyleLayer(layer);
layer.setEventedParent(this, {layer: {id: layer.id}});
this._layers[layer.id] = layer;
this._serializedLayers[layer.id] = layer.serialize();
}
this.dispatcher.broadcast('setLayers', this._serializeLayers(this._order));

Expand Down Expand Up @@ -1079,12 +1083,18 @@ class Style extends Evented {

const sourceResults = [];

// const serializedLayers = {};
// for (const layer in this._layers) {
// serializedLayers[layer] = this._layers[layer].serialize();
// }

for (const id in this.sourceCaches) {
if (params.layers && !includedSources[id]) continue;
sourceResults.push(
queryRenderedFeatures(
this.sourceCaches[id],
this._layers,
this._serializedLayers,
queryGeometry,
params,
transform)
Expand All @@ -1097,6 +1107,7 @@ class Style extends Evented {
sourceResults.push(
queryRenderedSymbols(
this._layers,
this._serializedLayers,
this.sourceCaches,
queryGeometry,
params,
Expand Down
2 changes: 1 addition & 1 deletion test/unit/source/query_features.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ test('QueryFeatures#rendered', (t) => {
t.test('returns empty object if source returns no tiles', (t) => {
const mockSourceCache = {tilesIn () { return []; }};
const transform = new Transform();
const result = queryRenderedFeatures(mockSourceCache, undefined, {}, undefined, transform);
const result = queryRenderedFeatures(mockSourceCache, {}, undefined, {}, undefined, transform);
t.deepEqual(result, []);
t.end();
});
Expand Down
2 changes: 1 addition & 1 deletion test/unit/style/style.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1811,7 +1811,7 @@ test('Style#queryRenderedFeatures', (t) => {
const transform = new Transform();
transform.resize(512, 512);

function queryMapboxFeatures(layers, getFeatureState, queryGeom, cameraQueryGeom, scale, params) {
function queryMapboxFeatures(layers, serializedLayers, getFeatureState, queryGeom, cameraQueryGeom, scale, params) {
const features = {
'land': [{
type: 'Feature',
Expand Down