diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-07-24 22:02:02 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-07-24 22:02:02 +0300 |
commit | db9f5f02010e4e0a76e4c83adc8c1a39d9f71fd0 (patch) | |
tree | 9a6c476a26c96a3c16afb1c89ec48da9b0d2d877 | |
parent | cafecd3f6fedc16e7bf5dff699960978c3b5cb3d (diff) | |
download | qtlocation-mapboxgl-upstream/mikhail_optimize_qrf_api.tar.gz |
[core] Optimize Query Rendered Features APIupstream/mikhail_optimize_qrf_api
This PR filters out invisible layers before quering features
(rather than after, like it happened before).
With this change `API_queryRenderedFeaturesAll` performance test
passes almost two times faster.
-rw-r--r-- | src/mbgl/renderer/render_layer.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.cpp | 15 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.cpp | 1 |
3 files changed, 10 insertions, 8 deletions
diff --git a/src/mbgl/renderer/render_layer.cpp b/src/mbgl/renderer/render_layer.cpp index f15dc7e6f4..7228fd9c26 100644 --- a/src/mbgl/renderer/render_layer.cpp +++ b/src/mbgl/renderer/render_layer.cpp @@ -36,7 +36,7 @@ bool RenderLayer::hasRenderPass(RenderPass pass) const { } bool RenderLayer::needsRendering() const { - return passes != RenderPass::None + return evaluatedProperties->renderPasses != mbgl::underlying_type(RenderPass::None) && baseImpl->visibility != style::VisibilityType::None; } diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index 4ce36434d2..4d8ef77302 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -487,7 +487,12 @@ void RenderOrchestrator::queryRenderedSymbols(std::unordered_map<std::string, st std::vector<Feature> RenderOrchestrator::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options, const std::unordered_map<std::string, const RenderLayer*>& layers) const { std::unordered_set<std::string> sourceIDs; + std::unordered_map<std::string, const RenderLayer*> filteredLayers; for (const auto& pair : layers) { + if (!pair.second->needsRendering() || !pair.second->supportsZoom(zoomHistory.lastZoom)) { + continue; + } + filteredLayers.emplace(pair); sourceIDs.emplace(pair.second->baseImpl->source); } @@ -497,12 +502,12 @@ std::vector<Feature> RenderOrchestrator::queryRenderedFeatures(const ScreenLineS std::unordered_map<std::string, std::vector<Feature>> resultsByLayer; for (const auto& sourceID : sourceIDs) { if (RenderSource* renderSource = getRenderSource(sourceID)) { - auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, layers, options, projMatrix); + auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, filteredLayers, options, projMatrix); std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin())); } } - queryRenderedSymbols(resultsByLayer, geometry, layers, options); + queryRenderedSymbols(resultsByLayer, geometry, filteredLayers, options); std::vector<Feature> result; @@ -511,11 +516,7 @@ std::vector<Feature> RenderOrchestrator::queryRenderedFeatures(const ScreenLineS } // Combine all results based on the style layer renderItems. - for (const auto& pair : layers) { - if (!pair.second->needsRendering() || !pair.second->supportsZoom(zoomHistory.lastZoom)) { - continue; - } - + for (const auto& pair : filteredLayers) { auto it = resultsByLayer.find(pair.second->baseImpl->id); if (it != resultsByLayer.end()) { std::move(it->second.begin(), it->second.end(), std::back_inserter(result)); diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index f47198e275..54e0b1eb26 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -293,6 +293,7 @@ std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRendered } LineString<double> queryGeometry; + queryGeometry.reserve(geometry.size()); for (const auto& p : geometry) { queryGeometry.push_back(TileCoordinate::fromScreenCoordinate( |