Skip to content

Commit

Permalink
Improve rendering performance of symbols with symbol-sort-key (#9751)
Browse files Browse the repository at this point in the history
* Dont sort symbol features if they dont overlap

* Move canOverlap to SymbolBucket constructor

* Remove leftover function arguments
  • Loading branch information
osvodef authored Aug 11, 2020
1 parent f8e1238 commit e1e68a8
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 5 deletions.
11 changes: 8 additions & 3 deletions src/data/bucket/symbol_bucket.js
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ class SymbolBucket implements Bucket {
fadeStartTime: number;
sortFeaturesByKey: boolean;
sortFeaturesByY: boolean;
canOverlap: boolean;
sortedAngle: number;
featureSortOrder: Array<number>;

Expand Down Expand Up @@ -367,10 +368,14 @@ class SymbolBucket implements Bucket {
const layout = this.layers[0].layout;
const sortKey = layout.get('symbol-sort-key');
const zOrder = layout.get('symbol-z-order');
this.canOverlap =
layout.get('text-allow-overlap') ||
layout.get('icon-allow-overlap') ||
layout.get('text-ignore-placement') ||
layout.get('icon-ignore-placement');
this.sortFeaturesByKey = zOrder !== 'viewport-y' && sortKey.constantOr(1) !== undefined;
const zOrderByViewportY = zOrder === 'viewport-y' || (zOrder === 'auto' && !this.sortFeaturesByKey);
this.sortFeaturesByY = zOrderByViewportY && (layout.get('text-allow-overlap') || layout.get('icon-allow-overlap') ||
layout.get('text-ignore-placement') || layout.get('icon-ignore-placement'));
this.sortFeaturesByY = zOrderByViewportY && this.canOverlap;

if (layout.get('symbol-placement') === 'point') {
this.writingModes = layout.get('text-writing-mode').map(wm => WritingMode[wm]);
Expand Down Expand Up @@ -618,7 +623,7 @@ class SymbolBucket implements Bucket {
const indexArray = arrays.indexArray;
const layoutVertexArray = arrays.layoutVertexArray;

const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, feature.sortKey);
const segment = arrays.segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray, this.canOverlap ? feature.sortKey : undefined);
const glyphOffsetArrayStart = this.glyphOffsetArray.length;
const vertexStartIndex = segment.vertexLength;

Expand Down
6 changes: 4 additions & 2 deletions src/render/draw_symbol.js
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,8 @@ function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate
// Unpitched point labels need to have their rotation applied after projection
const rotateInShader = rotateWithMap && !pitchWithMap && !alongLine;

const sortFeaturesByKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined;
const hasSortKey = layer.layout.get('symbol-sort-key').constantOr(1) !== undefined;
let sortFeaturesByKey = false;

const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);

Expand Down Expand Up @@ -333,7 +334,8 @@ function drawLayerSymbols(painter, sourceCache, layer, coords, isText, translate
hasHalo
};

if (sortFeaturesByKey) {
if (hasSortKey && bucket.canOverlap) {
sortFeaturesByKey = true;
const oldSegments = buffers.segments.get();
for (const segment of oldSegments) {
tileRenderState.push({
Expand Down

0 comments on commit e1e68a8

Please sign in to comment.