diff options
author | John Kassebaum <john.kassebaum@onxmaps.com> | 2019-07-25 16:58:36 -0700 |
---|---|---|
committer | John Kassebaum <john.kassebaum@onxmaps.com> | 2019-07-26 12:24:35 -0700 |
commit | 76f6fd4e6147a02a4f381bb259936d0b5240b640 (patch) | |
tree | e63e2b010af701ae91a9f023f9f363a2e2b87c8d | |
parent | b5980bda75b6f671718952054845c71f7c6a3356 (diff) | |
download | qtlocation-mapboxgl-upstream/pr-15231.tar.gz |
[core] Perform render pass layer introspection only if layer is need by source or if sourceless.upstream/pr-15231
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.
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.cpp | 23 | ||||
-rw-r--r-- | 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<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar std::vector<std::reference_wrapper<RenderLayer>> 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<Immutable<style::LayerProperties>> filteredLayersForSource; uint32_t index = 0u; const auto begin = layerImpls->begin(); @@ -292,15 +285,18 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar const Immutable<Layer::Impl>& 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<RenderTree> 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<RenderTree> 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<Immutable<style::LayerProperties>> filteredLayersForSource; }; } // namespace mbgl |