From a44b7f1e5ddae61260e55db5b68b10d9aa5e711d Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 3 Jun 2019 15:33:22 +0300 Subject: [core] Avoid unneeded update of symbol dynamic vertex buffer --- src/mbgl/renderer/buckets/symbol_bucket.cpp | 9 ++++++--- src/mbgl/text/placement.cpp | 12 ++++++++++-- src/mbgl/text/placement.hpp | 4 ++-- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/mbgl/renderer/buckets/symbol_bucket.cpp b/src/mbgl/renderer/buckets/symbol_bucket.cpp index fe083cca9e..c9dd126181 100644 --- a/src/mbgl/renderer/buckets/symbol_bucket.cpp +++ b/src/mbgl/renderer/buckets/symbol_bucket.cpp @@ -257,10 +257,13 @@ void SymbolBucket::updateVertices(Placement& placement, bool updateOpacities, co if (updateOpacities) { placement.updateBucketOpacities(*this, seenIds); placementChangesUploaded = false; + uploaded = false; + } + + if (placement.updateBucketDynamicVertices(*this, tile)) { + dynamicUploaded = false; + uploaded = false; } - placement.updateBucketDynamicVertices(*this, tile); - dynamicUploaded = false; - uploaded = false; } } // namespace mbgl diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index c95df02a41..452a071683 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -402,17 +402,20 @@ Point calculateVariableRenderShift(style::SymbolAnchorType anchor, float } } // namespace -void Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTile& tile) { +bool Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTile& tile) { using namespace style; const auto& layout = bucket.layout; const bool alongLine = layout.get() != SymbolPlacementType::Point; + bool result = false; + if (alongLine) { - if (bucket.hasIconData() && layout.get() == AlignmentType::Map) { + if (bucket.hasIconData() && layout.get() == AlignmentType::Map) { const bool pitchWithMap = layout.get() == style::AlignmentType::Map; const bool keepUpright = layout.get(); reprojectLineLabels(bucket.icon.dynamicVertices, bucket.icon.placedSymbols, tile.matrix, pitchWithMap, true /*rotateWithMap*/, keepUpright, tile, *bucket.iconSizeBinder, state); + result = true; } if (bucket.hasTextData() && layout.get() == AlignmentType::Map) { @@ -421,6 +424,7 @@ void Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTi reprojectLineLabels(bucket.text.dynamicVertices, bucket.text.placedSymbols, tile.matrix, pitchWithMap, true /*rotateWithMap*/, keepUpright, tile, *bucket.textSizeBinder, state); + result = true; } } else if (!layout.get().empty() && bucket.hasTextData()) { bucket.text.dynamicVertices.clear(); @@ -488,7 +492,11 @@ void Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTi } } } + + result = true; } + + return result; } void Placement::updateBucketOpacities(SymbolBucket& bucket, std::set& seenCrossTileIDs) { diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index a568b6985f..69d05c94db 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -118,8 +118,8 @@ private: SymbolBucket&, const BucketPlacementParameters&, std::set& seenCrossTileIDs); - - void updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTile& tile); + // Returns `true` if bucket vertices were updated; returns `false` otherwise. + bool updateBucketDynamicVertices(SymbolBucket& bucket, const RenderTile& tile); void updateBucketOpacities(SymbolBucket&, std::set&); void markUsedJustification(SymbolBucket&, style::TextVariableAnchorType, SymbolInstance&); -- cgit v1.2.1