From 6c57b96c7c99bef23599abdc937c323fc7c617d2 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Tue, 10 Sep 2019 16:25:14 +0300 Subject: [core] Initiate new placement only when a new bucket appeares --- src/mbgl/renderer/render_orchestrator.cpp | 9 ++++++--- src/mbgl/text/cross_tile_symbol_index.cpp | 19 +++++++++---------- src/mbgl/text/cross_tile_symbol_index.hpp | 9 ++++++++- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index eb6963c970..1e2541c4d4 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -360,11 +360,14 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar crossTileSymbolIndex.reset(); } + bool symbolBucketsAdded = false; bool symbolBucketsChanged = false; for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { - if (crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude())) symbolBucketsChanged = true; + auto result = crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude()); + symbolBucketsAdded = symbolBucketsAdded || (result & CrossTileSymbolIndex::AddLayerResult::BucketsAdded); + symbolBucketsChanged = symbolBucketsChanged || (result != CrossTileSymbolIndex::AddLayerResult::NoChanges); } - renderTreeParameters->placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom()) || symbolBucketsChanged; + renderTreeParameters->placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom()) || symbolBucketsAdded; std::set usedSymbolLayers; if (renderTreeParameters->placementChanged) { @@ -389,7 +392,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { - placement->updateLayerBuckets(*it, updateParameters.transformState, renderTreeParameters->placementChanged); + placement->updateLayerBuckets(*it, updateParameters.transformState, renderTreeParameters->placementChanged || symbolBucketsChanged); } renderTreeParameters->symbolFadeChange = placement->symbolFadeChange(updateParameters.timePoint); diff --git a/src/mbgl/text/cross_tile_symbol_index.cpp b/src/mbgl/text/cross_tile_symbol_index.cpp index 43ed85d957..55ab2cc3c5 100644 --- a/src/mbgl/text/cross_tile_symbol_index.cpp +++ b/src/mbgl/text/cross_tile_symbol_index.cpp @@ -163,10 +163,10 @@ bool CrossTileSymbolLayerIndex::removeStaleBuckets(const std::unordered_set AddLayerResult { auto& layerIndex = layerIndexes[layer.getID()]; - bool symbolBucketsChanged = false; + AddLayerResult result = AddLayerResult::NoChanges; std::unordered_set currentBucketIDs; layerIndex.handleWrapJump(lng); @@ -174,16 +174,15 @@ bool CrossTileSymbolIndex::addLayer(const RenderLayer& layer, float lng) { for (const auto& item : layer.getPlacementData()) { const RenderTile& renderTile = item.tile; Bucket& bucket = item.bucket; - auto result = bucket.registerAtCrossTileIndex(layerIndex, renderTile.getOverscaledTileID(), maxCrossTileID); - assert(result.first != 0u); - symbolBucketsChanged = symbolBucketsChanged || result.second; - currentBucketIDs.insert(result.first); + auto pair = bucket.registerAtCrossTileIndex(layerIndex, renderTile.getOverscaledTileID(), maxCrossTileID); + assert(pair.first != 0u); + if (pair.second) result |= AddLayerResult::BucketsAdded; + currentBucketIDs.insert(pair.first); } - if (layerIndex.removeStaleBuckets(currentBucketIDs)) { - symbolBucketsChanged = true; - } - return symbolBucketsChanged; + if (layerIndex.removeStaleBuckets(currentBucketIDs)) result |= AddLayerResult::BucketsRemoved; + + return result; } void CrossTileSymbolIndex::pruneUnusedLayers(const std::set& usedLayers) { diff --git a/src/mbgl/text/cross_tile_symbol_index.hpp b/src/mbgl/text/cross_tile_symbol_index.hpp index d905aeb569..4e32698b3e 100644 --- a/src/mbgl/text/cross_tile_symbol_index.hpp +++ b/src/mbgl/text/cross_tile_symbol_index.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -58,7 +59,13 @@ class CrossTileSymbolIndex { public: CrossTileSymbolIndex(); - bool addLayer(const RenderLayer& layer, float lng); + enum class AddLayerResult : uint8_t { + NoChanges = 0, + BucketsAdded = 1 << 0, + BucketsRemoved = 1 << 1 + }; + + AddLayerResult addLayer(const RenderLayer& layer, float lng); void pruneUnusedLayers(const std::set&); void reset(); -- cgit v1.2.1