From def38cf4db9e973f1d3e13f4ee2fba1afd694ea0 Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Mon, 10 Feb 2020 22:29:11 +0200 Subject: [PATCH] [core] Override default prefetch delta if source has it's own setting --- .../annotation/render_annotation_source.cpp | 26 +++++++++---------- .../sources/render_custom_geometry_source.cpp | 25 ++++++++++-------- .../sources/render_geojson_source.cpp | 24 +++++++++-------- .../sources/render_raster_dem_source.cpp | 22 ++++++++-------- .../renderer/sources/render_raster_source.cpp | 22 ++++++++-------- .../renderer/sources/render_vector_source.cpp | 24 +++++++++-------- src/mbgl/renderer/tile_pyramid.cpp | 9 ++++--- src/mbgl/renderer/tile_pyramid.hpp | 3 ++- test/style/source.test.cpp | 20 +++++++------- 9 files changed, 94 insertions(+), 81 deletions(-) diff --git a/src/mbgl/annotation/render_annotation_source.cpp b/src/mbgl/annotation/render_annotation_source.cpp index e3acfcb3c..85665961d 100644 --- a/src/mbgl/annotation/render_annotation_source.cpp +++ b/src/mbgl/annotation/render_annotation_source.cpp @@ -28,19 +28,19 @@ void RenderAnnotationSource::update(Immutable baseImpl_, enabled = needsRendering; - tilePyramid.update(layers, - needsRendering, - needsRelayout, - parameters, - SourceType::Annotations, - util::tileSize, - // Zoom level 16 is typically sufficient for annotations. - // See https://github.com/mapbox/mapbox-gl-native/issues/10197 - { 0, 16 }, - optional {}, - [&] (const OverscaledTileID& tileID) { - return std::make_unique(tileID, parameters); - }); + tilePyramid.update( + layers, + needsRendering, + needsRelayout, + parameters, + SourceType::Annotations, + util::tileSize, + // Zoom level 16 is typically sufficient for annotations. + // See https://github.com/mapbox/mapbox-gl-native/issues/10197 + {0, 16}, + optional{}, + [&](const OverscaledTileID& tileID) { return std::make_unique(tileID, parameters); }, + baseImpl->getPrefetchZoomDelta()); } std::unordered_map> diff --git a/src/mbgl/renderer/sources/render_custom_geometry_source.cpp b/src/mbgl/renderer/sources/render_custom_geometry_source.cpp index 6b8165837..ea6f5c310 100644 --- a/src/mbgl/renderer/sources/render_custom_geometry_source.cpp +++ b/src/mbgl/renderer/sources/render_custom_geometry_source.cpp @@ -33,17 +33,20 @@ void RenderCustomGeometrySource::update(Immutable baseImpl_ return; } - tilePyramid.update(layers, - needsRendering, - needsRelayout, - parameters, - SourceType::CustomVector, - util::tileSize, - impl().getZoomRange(), - {}, - [&] (const OverscaledTileID& tileID) { - return std::make_unique(tileID, impl().id, parameters, impl().getTileOptions(), *tileLoader); - }); + tilePyramid.update( + layers, + needsRendering, + needsRelayout, + parameters, + SourceType::CustomVector, + util::tileSize, + impl().getZoomRange(), + {}, + [&](const OverscaledTileID& tileID) { + return std::make_unique( + tileID, impl().id, parameters, impl().getTileOptions(), *tileLoader); + }, + baseImpl->getPrefetchZoomDelta()); } } // namespace mbgl diff --git a/src/mbgl/renderer/sources/render_geojson_source.cpp b/src/mbgl/renderer/sources/render_geojson_source.cpp index 94d171cf1..45a91e3fa 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.cpp +++ b/src/mbgl/renderer/sources/render_geojson_source.cpp @@ -103,17 +103,19 @@ void RenderGeoJSONSource::update(Immutable baseImpl_, if (!data_) return; - tilePyramid.update(layers, - needsRendering, - needsRelayout, - parameters, - SourceType::GeoJSON, - util::tileSize, - impl().getZoomRange(), - optional{}, - [&, data_](const OverscaledTileID& tileID) { - return std::make_unique(tileID, impl().id, parameters, data_); - }); + tilePyramid.update( + layers, + needsRendering, + needsRelayout, + parameters, + SourceType::GeoJSON, + util::tileSize, + impl().getZoomRange(), + optional{}, + [&, data_](const OverscaledTileID& tileID) { + return std::make_unique(tileID, impl().id, parameters, data_); + }, + baseImpl->getPrefetchZoomDelta()); } mapbox::util::variant diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp index fb6e34367..953484f6c 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp @@ -27,17 +27,17 @@ void RenderRasterDEMSource::updateInternal(const Tileset& tileset, const bool needsRendering, const bool needsRelayout, const TileParameters& parameters) { - tilePyramid.update(layers, - needsRendering, - needsRelayout, - parameters, - SourceType::RasterDEM, - impl().getTileSize(), - tileset.zoomRange, - tileset.bounds, - [&] (const OverscaledTileID& tileID) { - return std::make_unique(tileID, parameters, tileset); - }); + tilePyramid.update( + layers, + needsRendering, + needsRelayout, + parameters, + SourceType::RasterDEM, + impl().getTileSize(), + tileset.zoomRange, + tileset.bounds, + [&](const OverscaledTileID& tileID) { return std::make_unique(tileID, parameters, tileset); }, + baseImpl->getPrefetchZoomDelta()); algorithm::updateTileMasks(tilePyramid.getRenderedTiles()); } diff --git a/src/mbgl/renderer/sources/render_raster_source.cpp b/src/mbgl/renderer/sources/render_raster_source.cpp index 408f8a4e1..7ef7b2645 100644 --- a/src/mbgl/renderer/sources/render_raster_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_source.cpp @@ -25,17 +25,17 @@ void RenderRasterSource::updateInternal(const Tileset& tileset, const bool needsRendering, const bool needsRelayout, const TileParameters& parameters) { - tilePyramid.update(layers, - needsRendering, - needsRelayout, - parameters, - SourceType::Raster, - impl().getTileSize(), - tileset.zoomRange, - tileset.bounds, - [&] (const OverscaledTileID& tileID) { - return std::make_unique(tileID, parameters, tileset); - }); + tilePyramid.update( + layers, + needsRendering, + needsRelayout, + parameters, + SourceType::Raster, + impl().getTileSize(), + tileset.zoomRange, + tileset.bounds, + [&](const OverscaledTileID& tileID) { return std::make_unique(tileID, parameters, tileset); }, + baseImpl->getPrefetchZoomDelta()); algorithm::updateTileMasks(tilePyramid.getRenderedTiles()); } diff --git a/src/mbgl/renderer/sources/render_vector_source.cpp b/src/mbgl/renderer/sources/render_vector_source.cpp index 6e4fdede1..324599d45 100644 --- a/src/mbgl/renderer/sources/render_vector_source.cpp +++ b/src/mbgl/renderer/sources/render_vector_source.cpp @@ -21,17 +21,19 @@ void RenderVectorSource::updateInternal(const Tileset& tileset, const bool needsRendering, const bool needsRelayout, const TileParameters& parameters) { - tilePyramid.update(layers, - needsRendering, - needsRelayout, - parameters, - SourceType::Vector, - util::tileSize, - tileset.zoomRange, - tileset.bounds, - [&] (const OverscaledTileID& tileID) { - return std::make_unique(tileID, baseImpl->id, parameters, tileset); - }); + tilePyramid.update( + layers, + needsRendering, + needsRelayout, + parameters, + SourceType::Vector, + util::tileSize, + tileset.zoomRange, + tileset.bounds, + [&](const OverscaledTileID& tileID) { + return std::make_unique(tileID, baseImpl->id, parameters, tileset); + }, + baseImpl->getPrefetchZoomDelta()); } } // namespace mbgl diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index 586d3b5a8..38d984bec 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -57,7 +57,8 @@ void TilePyramid::update(const std::vector>& l const uint16_t tileSize, const Range zoomRange, optional bounds, - std::function (const OverscaledTileID&)> createTile) { + std::function(const OverscaledTileID&)> createTile, + optional sourcePrefetchZoomDelta) { // If we need a relayout, abandon any cached tiles; they're now stale. if (needsRelayout) { cache.clear(); @@ -105,8 +106,10 @@ void TilePyramid::update(const std::vector>& l if (parameters.mode == MapMode::Continuous && type != style::SourceType::GeoJSON && type != style::SourceType::Annotations) { // Request lower zoom level tiles (if configured to do so) in an attempt // to show something on the screen faster at the cost of a little of bandwidth. - if (parameters.prefetchZoomDelta) { - panZoom = std::max(tileZoom - parameters.prefetchZoomDelta, zoomRange.min); + const uint8_t prefetchZoomDelta = + sourcePrefetchZoomDelta ? *sourcePrefetchZoomDelta : parameters.prefetchZoomDelta; + if (prefetchZoomDelta) { + panZoom = std::max(tileZoom - prefetchZoomDelta, zoomRange.min); } if (panZoom < idealZoom) { diff --git a/src/mbgl/renderer/tile_pyramid.hpp b/src/mbgl/renderer/tile_pyramid.hpp index 3b5cab5d6..5f2bfd1ea 100644 --- a/src/mbgl/renderer/tile_pyramid.hpp +++ b/src/mbgl/renderer/tile_pyramid.hpp @@ -41,7 +41,8 @@ public: uint16_t tileSize, Range zoomRange, optional bounds, - std::function (const OverscaledTileID&)> createTile); + std::function(const OverscaledTileID&)> createTile, + optional sourcePrefetchZoomDelta); const std::map>& getRenderedTiles() const { return renderedTiles; } Tile* getTile(const OverscaledTileID&); diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp index 0286aaaec..dbc67681e 100644 --- a/test/style/source.test.cpp +++ b/test/style/source.test.cpp @@ -765,15 +765,17 @@ public: const bool needsRendering, const bool needsRelayout, const TileParameters& parameters) override { - tilePyramid.update(layers, - needsRendering, - needsRelayout, - parameters, - SourceType::Vector, - util::tileSize, - tileset.zoomRange, - tileset.bounds, - [&](const OverscaledTileID& tileID) { return std::make_unique(*this, tileID); }); + tilePyramid.update( + layers, + needsRendering, + needsRelayout, + parameters, + SourceType::Vector, + util::tileSize, + tileset.zoomRange, + tileset.bounds, + [&](const OverscaledTileID& tileID) { return std::make_unique(*this, tileID); }, + baseImpl->getPrefetchZoomDelta()); } const optional& getTileset() const override {