Improve performance of symbol layers with identical or no text #12669
+125
−53
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Closes #7973. There was an accidental quadratic behavior in
CrossTileSymbolIndex
(responsible for deduplicating symbols across tiles) when a map had a ton of symbols with the same text (or no text, just an icon).This PR changes the logic so that instead of indexing symbol instances by key (which is a numeric hash of its text), we make a KDBush index and search for duplicate symbols spatially. KDBush is already included as a dependency of Supercluster, so it doesn't increase the bundle size, and it's pretty fast, so the approach should work well for both the "lots of identical icons" (added in the
debug/symbols-generated.html
debug page) and "lots of different text labels" (e.g. Streets) cases.In theory, this should also improve memory footprint for Streets because we avoid creating thousands of small arrays and a big object with key to array mapping — KDBush is much more memory-efficient. We should run a benchmark before merging to make sure it doesn't accidentally regress anything.
Launch Checklist
@mapbox/gl-native
if this PR includes shader changes or needs a native port — @alexshalamov this affects Native too because it has the same logic.mapbox-gl-js
changelog:<changelog>Improve performance of symbol layers with identical or no text</changelog>