From 8d94bb1be0abfb03e958abe740976e920ea53f27 Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Mon, 8 Jul 2019 10:59:45 +0300 Subject: [core] Reserve size for filtered render layers --- src/mbgl/renderer/render_orchestrator.cpp | 11 +++++++++-- src/mbgl/renderer/render_orchestrator.hpp | 8 ++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index c42273eca2..7df74cda71 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -271,11 +271,17 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar std::vector> layersNeedPlacement; auto renderItemsEmplaceHint = layerRenderItems.begin(); + // Reserve size for filteredLayersForSource if there are sources. + if (!sourceImpls->empty()) { + filteredLayersForSource.reserve(layerImpls->size()); + if (filteredLayersForSource.capacity() > layerImpls->size()) { + filteredLayersForSource.shrink_to_fit(); + } + } + // Update all sources and initialize renderItems. for (const auto& sourceImpl : *sourceImpls) { RenderSource* source = renderSources.at(sourceImpl->id).get(); - std::vector> filteredLayersForSource; - filteredLayersForSource.reserve(layerImpls->size()); bool sourceNeedsRendering = false; bool sourceNeedsRelayout = false; @@ -321,6 +327,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar sourceNeedsRendering, sourceNeedsRelayout, tileParameters); + filteredLayersForSource.clear(); } renderTreeParameters->loaded = updateParameters.styleLoaded && isLoaded(); diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index 4622ac1749..884bd21b7b 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -33,6 +33,10 @@ class PatternAtlas; class CrossTileSymbolIndex; class RenderTree; +namespace style { + class LayerProperties; +} // namespace style + class RenderOrchestrator final : public GlyphManagerObserver, public ImageManagerObserver, public RenderSourceObserver { @@ -113,6 +117,10 @@ private: const bool backgroundLayerAsColor; bool contextLost = false; + + // Vector with reserved capacity of layerImpls->size() to avoid reallocation + // on each frame. + std::vector> filteredLayersForSource; }; } // namespace mbgl -- cgit v1.2.1