summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-07-24 22:02:02 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-07-24 22:02:02 +0300
commitdb9f5f02010e4e0a76e4c83adc8c1a39d9f71fd0 (patch)
tree9a6c476a26c96a3c16afb1c89ec48da9b0d2d877
parentcafecd3f6fedc16e7bf5dff699960978c3b5cb3d (diff)
downloadqtlocation-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.cpp2
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp15
-rw-r--r--src/mbgl/renderer/tile_pyramid.cpp1
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(