From 76f6fd4e6147a02a4f381bb259936d0b5240b640 Mon Sep 17 00:00:00 2001 From: John Kassebaum Date: Thu, 25 Jul 2019 16:58:36 -0700 Subject: [core] Perform render pass layer introspection only if layer is need by source or if sourceless. Remove orchestrator property vector of layer propertes which was intended to avoid reallocation per frame, but the cost of resizing reduced frame rate by half, and even so, without per frame resizing is no faster than local instantiation per frame. Only evaluate zoom state on a sourceless layer after first verifying the layer is sourceless and visible. --- src/mbgl/renderer/render_orchestrator.cpp | 23 ++++++++++------------- src/mbgl/renderer/render_orchestrator.hpp | 4 ---- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 4d8ef77302..7776e9da1e 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -271,19 +271,12 @@ 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(); bool sourceNeedsRendering = false; - bool sourceNeedsRelayout = false; + bool sourceNeedsRelayout = false; + std::vector> filteredLayersForSource; uint32_t index = 0u; const auto begin = layerImpls->begin(); @@ -292,15 +285,18 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar const Immutable& layerImpl = *it; RenderLayer* layer = getRenderLayer(layerImpl->id); const auto* layerInfo = layerImpl->getTypeInfo(); - const bool layerIsVisible = layer->baseImpl->visibility != style::VisibilityType::None; - const bool zoomFitsLayer = layer->supportsZoom(zoomHistory.lastZoom); + renderTreeParameters->has3D |= (layerInfo->pass3d == LayerTypeInfo::Pass3D::Required); if (layerInfo->source != LayerTypeInfo::Source::NotRequired) { if (layerImpl->source == sourceImpl->id) { sourceNeedsRelayout = (sourceNeedsRelayout || hasImageDiff || constantsMaskChanged.count(layerImpl->id) || hasLayoutDifference(layerDiff, layerImpl->id)); + + const bool layerIsVisible = layer->baseImpl->visibility != style::VisibilityType::None; if (layerIsVisible) { filteredLayersForSource.push_back(layer->evaluatedProperties); + + const bool zoomFitsLayer = layer->supportsZoom(zoomHistory.lastZoom); if (zoomFitsLayer) { sourceNeedsRendering = true; renderItemsEmplaceHint = layerRenderItems.emplace_hint(renderItemsEmplaceHint, *layer, source, index); @@ -311,7 +307,8 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } // Handle layers without source. - if (layerIsVisible && zoomFitsLayer && sourceImpl.get() == sourceImpls->at(0).get()) { + if (sourceImpl.get() != sourceImpls->at(0).get() || layer->baseImpl->visibility == style::VisibilityType::None) continue; + if (layer->supportsZoom(zoomHistory.lastZoom)) { if (backgroundLayerAsColor && layerImpl.get() == layerImpls->at(0).get()) { const auto& solidBackground = layer->getSolidBackground(); if (solidBackground) { @@ -322,12 +319,12 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar renderItemsEmplaceHint = layerRenderItems.emplace_hint(renderItemsEmplaceHint, *layer, nullptr, index); } } + source->update(sourceImpl, filteredLayersForSource, 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 884bd21b7b..d36e2606dc 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -117,10 +117,6 @@ 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