From 7ba5d5e2dd85044eb51f1ed72e5d07dfcba35e54 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 23 Mar 2020 11:47:32 +0200 Subject: [core] Introduce Placement::placeLayers() --- src/mbgl/renderer/render_layer.hpp | 2 ++ src/mbgl/renderer/render_orchestrator.cpp | 37 +++++++++++++------------------ src/mbgl/renderer/render_orchestrator.hpp | 5 ++--- src/mbgl/text/placement.cpp | 7 ++++++ src/mbgl/text/placement.hpp | 6 ++--- 5 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 53dafb3b7b..f7232a5aa0 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -146,4 +146,6 @@ private: bool hasRenderFailures = false; }; +using RenderLayerReferences = std::vector>; + } // namespace mbgl diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index bf14813492..e38990293f 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -62,7 +62,7 @@ public: std::vector> sourceRenderItems_, LineAtlas& lineAtlas_, PatternAtlas& patternAtlas_, - std::vector> layersNeedPlacement_, + RenderLayerReferences layersNeedPlacement_, Immutable placement_, bool updateSymbolOpacities_) : RenderTree(std::move(parameters_)), @@ -96,7 +96,7 @@ public: std::vector> sourceRenderItems; std::reference_wrapper lineAtlas; std::reference_wrapper patternAtlas; - std::vector> layersNeedPlacement; + RenderLayerReferences layersNeedPlacement; Immutable placement; bool updateSymbolOpacities; }; @@ -379,15 +379,20 @@ std::unique_ptr RenderOrchestrator::createRenderTree( } // Symbol placement. bool symbolBucketsChanged = false; + bool symbolBucketsAdded = false; + std::set usedSymbolLayers; auto longitude = updateParameters->transformState.getLatLng().longitude(); - if (isMapModeContinuous) { - bool symbolBucketsAdded = false; - for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) { - auto result = crossTileSymbolIndex.addLayer(*it, longitude); + for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) { + RenderLayer& layer = *it; + auto result = crossTileSymbolIndex.addLayer(layer, longitude); + if (isMapModeContinuous) { + usedSymbolLayers.insert(layer.getID()); symbolBucketsAdded = symbolBucketsAdded || (result & CrossTileSymbolIndex::AddLayerResult::BucketsAdded); symbolBucketsChanged = symbolBucketsChanged || (result != CrossTileSymbolIndex::AddLayerResult::NoChanges); } + } + if (isMapModeContinuous) { optional placementUpdatePeriodOverride; if (symbolBucketsAdded && !tiltedView) { // If the view is not tilted, we want *the new* symbols to show up faster, however simple setting @@ -403,22 +408,14 @@ std::unique_ptr RenderOrchestrator::createRenderTree( updateParameters->timePoint, updateParameters->transformState.getZoom(), placementUpdatePeriodOverride); symbolBucketsChanged |= renderTreeParameters->placementChanged; - std::set usedSymbolLayers; if (renderTreeParameters->placementChanged) { Mutable placement = makeMutable(updateParameters, placementController.getPlacement()); - - for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) { - const RenderLayer& layer = *it; - usedSymbolLayers.insert(layer.getID()); - placement->placeLayer(layer); - } - - placement->commit(); + placement->placeLayers(layersNeedPlacement); + placementController.setPlacement(std::move(placement)); crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers); for (const auto& entry : renderSources) { entry.second->updateFadingTiles(); } - placementController.setPlacement(std::move(placement)); } else { placementController.setPlacementStale(); } @@ -429,14 +426,10 @@ std::unique_ptr RenderOrchestrator::createRenderTree( renderTreeParameters->placementChanged = symbolBucketsChanged = !layersNeedPlacement.empty(); if (renderTreeParameters->placementChanged) { Mutable placement = makeMutable(updateParameters); - for (auto it = layersNeedPlacement.crbegin(); it != layersNeedPlacement.crend(); ++it) { - const RenderLayer& layer = *it; - crossTileSymbolIndex.addLayer(layer, longitude); - placement->placeLayer(layer); - } - placement->commit(); + placement->placeLayers(layersNeedPlacement); placementController.setPlacement(std::move(placement)); } + crossTileSymbolIndex.reset(); renderTreeParameters->symbolFadeChange = 1.0f; renderTreeParameters->needsRepaint = false; } diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index a8a6d04901..19632c3218 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -21,7 +21,6 @@ namespace mbgl { class RendererObserver; class RenderSource; -class RenderLayer; class UpdateParameters; class RenderStaticData; class RenderedQueryOptions; @@ -129,8 +128,8 @@ private: // Vectors with reserved capacity of layerImpls->size() to avoid reallocation // on each frame. std::vector> filteredLayersForSource; - std::vector> orderedLayers; - std::vector> layersNeedPlacement; + RenderLayerReferences orderedLayers; + RenderLayerReferences layersNeedPlacement; }; } // namespace mbgl diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index e62be00b47..a6de0baba7 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -105,6 +105,13 @@ Placement::Placement(std::shared_ptr updateParameters_, Placement::Placement() : collisionIndex({}, MapMode::Static), collisionGroups(true) {} +void Placement::placeLayers(const RenderLayerReferences& layers) { + for (auto it = layers.crbegin(); it != layers.crend(); ++it) { + placeLayer(*it); + } + commit(); +} + void Placement::placeLayer(const RenderLayer& layer) { std::set seenCrossTileIDs; for (const BucketPlacementData& data : layer.getPlacementData()) { diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index d3f92eb068..dcb67fa8c8 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -108,9 +108,7 @@ class Placement { public: Placement(std::shared_ptr, optional> prevPlacement = nullopt); Placement(); - - void placeLayer(const RenderLayer&); - void commit(); + void placeLayers(const RenderLayerReferences&); void updateLayerBuckets(const RenderLayer&, const TransformState&, bool updateOpacities) const; float symbolFadeChange(TimePoint now) const; bool hasTransitions(TimePoint now) const; @@ -128,6 +126,8 @@ public: private: friend SymbolBucket; void placeSymbolBucket(const BucketPlacementData&, std::set& seenCrossTileIDs); + void placeLayer(const RenderLayer&); + void commit(); // Returns `true` if bucket vertices were updated; returns `false` otherwise. bool updateBucketDynamicVertices(SymbolBucket&, const TransformState&, const RenderTile& tile) const; void updateBucketOpacities(SymbolBucket&, const TransformState&, std::set&) const; -- cgit v1.2.1