From 735fc0a4dcbd82f4e63ee9154cc10e060bcd5ad5 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 25 Mar 2020 13:02:46 +0200 Subject: [core][tile mode] Share seenCrossTileIDs across all placeLayer() calls Thus we obviate lots of repeated operations for already placed symbols. --- src/mbgl/text/placement.cpp | 20 ++++++++++++++------ src/mbgl/text/placement.hpp | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 049a72f63c..0436a3ccd5 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -107,13 +107,13 @@ Placement::~Placement() = default; void Placement::placeLayers(const RenderLayerReferences& layers) { for (auto it = layers.crbegin(); it != layers.crend(); ++it) { - placeLayer(*it); + std::set seenCrossTileIDs; + placeLayer(*it, seenCrossTileIDs); } commit(); } -void Placement::placeLayer(const RenderLayer& layer) { - std::set seenCrossTileIDs; +void Placement::placeLayer(const RenderLayer& layer, std::set& seenCrossTileIDs) { for (const BucketPlacementData& data : layer.getPlacementData()) { Bucket& bucket = data.bucket; bucket.place(*this, data, seenCrossTileIDs); @@ -1159,7 +1159,7 @@ public: explicit StaticPlacement(std::shared_ptr updateParameters_) : Placement(std::move(updateParameters_), nullopt) {} -private: +protected: void commit() override; float symbolFadeChange(TimePoint) const override { return 1.0f; } bool hasTransitions(TimePoint) const override { return false; } @@ -1190,6 +1190,7 @@ private: std::unordered_map locationCache; optional tileBorders; + std::set seenCrossTileIDs; bool onlyLabelsIntersectingTileBorders; }; @@ -1197,10 +1198,17 @@ void TilePlacement::placeLayers(const RenderLayerReferences& layers) { // In order to avoid label cut-offs, at first, place the labels, // which cross tile boundaries. onlyLabelsIntersectingTileBorders = true; - StaticPlacement::placeLayers(layers); + seenCrossTileIDs.clear(); + for (auto it = layers.crbegin(); it != layers.crend(); ++it) { + placeLayer(*it, seenCrossTileIDs); + } // Place the rest labels. onlyLabelsIntersectingTileBorders = false; - StaticPlacement::placeLayers(layers); + for (auto it = layers.crbegin(); it != layers.crend(); ++it) { + placeLayer(*it, seenCrossTileIDs); + } + + commit(); } optional TilePlacement::getAvoidEdges(const SymbolBucket& bucket, const mat4& posMatrix) { diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 396aad4425..e86135130a 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -139,7 +139,7 @@ public: protected: friend SymbolBucket; void placeSymbolBucket(const BucketPlacementData&, std::set& seenCrossTileIDs); - void placeLayer(const RenderLayer&); + void placeLayer(const RenderLayer&, std::set&); virtual void commit(); // Implentation specific hooks, which get called during a symbol bucket placement. virtual optional getAvoidEdges(const SymbolBucket&, const mat4& /*posMatrix*/) { -- cgit v1.2.1