diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-03-21 21:55:22 +0200 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-04-01 16:18:55 -0400 |
commit | 15f73a06f2048d4b5f0481d54a79f3f349187b11 (patch) | |
tree | 5166ba99751b11d6a994d0f3825332caf04ccd64 | |
parent | 09f7bbcf7c07cc360c933ab1637662397b7db674 (diff) | |
download | qtlocation-mapboxgl-15f73a06f2048d4b5f0481d54a79f3f349187b11.tar.gz |
[core] Add setMaxOverscaleFactorForParentTiles
-rw-r--r-- | include/mbgl/style/source.hpp | 14 | ||||
-rw-r--r-- | src/mbgl/algorithm/update_renderables.hpp | 9 | ||||
-rw-r--r-- | src/mbgl/annotation/render_annotation_source.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_custom_geometry_source.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_geojson_source.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_dem_source.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_raster_source.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/sources/render_vector_source.cpp | 3 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.cpp | 26 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.hpp | 3 | ||||
-rw-r--r-- | src/mbgl/style/source.cpp | 12 | ||||
-rw-r--r-- | src/mbgl/style/source_impl.cpp | 21 | ||||
-rw-r--r-- | src/mbgl/style/source_impl.hpp | 3 |
13 files changed, 92 insertions, 14 deletions
diff --git a/include/mbgl/style/source.hpp b/include/mbgl/style/source.hpp index 622c2e42ff..32b15bdf47 100644 --- a/include/mbgl/style/source.hpp +++ b/include/mbgl/style/source.hpp @@ -75,6 +75,20 @@ public: virtual void loadDescription(FileSource&) = 0; void setPrefetchZoomDelta(optional<uint8_t> delta) noexcept; optional<uint8_t> getPrefetchZoomDelta() const noexcept; + + // Sets a limit for how much a parent tile can be overscaled. + // + // When a set of tiles for a current zoom level is being rendered and some of the + // ideal tiles that cover the screen are not yet loaded, parent tile could be + // used instead. This might introduce unwanted rendering side-effects, especially + // for raster tiles that are overscaled multiple times. + // + // For example, an overscale factor of 3 would mean that on zoom level 3, the + // minimum zoom level of a parent tile that could be used in place of an ideal + // tile during rendering would be zoom 0. By default, no limit is set, so any + // parent tile may be used. + void setMaxOverscaleFactorForParentTiles(optional<uint8_t> overscaleFactor) noexcept; + optional<uint8_t> getMaxOverscaleFactorForParentTiles() const noexcept; void dumpDebugLogs() const; virtual bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const = 0; diff --git a/src/mbgl/algorithm/update_renderables.hpp b/src/mbgl/algorithm/update_renderables.hpp index 57cd4f41ec..316ada8269 100644 --- a/src/mbgl/algorithm/update_renderables.hpp +++ b/src/mbgl/algorithm/update_renderables.hpp @@ -2,6 +2,7 @@ #include <mbgl/tile/tile_id.hpp> #include <mbgl/tile/tile_necessity.hpp> +#include <mbgl/util/optional.hpp> #include <mbgl/util/range.hpp> #include <unordered_set> @@ -20,7 +21,8 @@ void updateRenderables(GetTileFn getTile, RenderTileFn renderTile, const IdealTileIDs& idealTileIDs, const Range<uint8_t>& zoomRange, - const uint8_t dataTileZoom) { + const uint8_t dataTileZoom, + const optional<uint8_t>& maxParentOverscaleFactor = nullopt) { std::unordered_set<OverscaledTileID> checked; bool covered; int32_t overscaledZ; @@ -86,6 +88,11 @@ void updateRenderables(GetTileFn getTile, for (overscaledZ = dataTileZoom - 1; overscaledZ >= zoomRange.min; --overscaledZ) { const auto parentDataTileID = idealDataTileID.scaledTo(overscaledZ); + // Request / render parent tile only if it's overscale factor is less than defined maximum. + if (maxParentOverscaleFactor && (dataTileZoom - overscaledZ) > *maxParentOverscaleFactor) { + break; + } + if (checked.find(parentDataTileID) != checked.end()) { // Break parent tile ascent, this route has been checked by another child // tile before. diff --git a/src/mbgl/annotation/render_annotation_source.cpp b/src/mbgl/annotation/render_annotation_source.cpp index 85665961d3..b03b7662d8 100644 --- a/src/mbgl/annotation/render_annotation_source.cpp +++ b/src/mbgl/annotation/render_annotation_source.cpp @@ -40,7 +40,8 @@ void RenderAnnotationSource::update(Immutable<style::Source::Impl> baseImpl_, {0, 16}, optional<LatLngBounds>{}, [&](const OverscaledTileID& tileID) { return std::make_unique<AnnotationTile>(tileID, parameters); }, - baseImpl->getPrefetchZoomDelta()); + baseImpl->getPrefetchZoomDelta(), + baseImpl->getMaxOverscaleFactorForParentTiles()); } std::unordered_map<std::string, std::vector<Feature>> diff --git a/src/mbgl/renderer/sources/render_custom_geometry_source.cpp b/src/mbgl/renderer/sources/render_custom_geometry_source.cpp index a54802b21b..ecb74b6503 100644 --- a/src/mbgl/renderer/sources/render_custom_geometry_source.cpp +++ b/src/mbgl/renderer/sources/render_custom_geometry_source.cpp @@ -53,7 +53,8 @@ void RenderCustomGeometrySource::update(Immutable<style::Source::Impl> baseImpl_ return std::make_unique<CustomGeometryTile>( tileID, impl().id, parameters, impl().getTileOptions(), *tileLoader); }, - baseImpl->getPrefetchZoomDelta()); + baseImpl->getPrefetchZoomDelta(), + baseImpl->getMaxOverscaleFactorForParentTiles()); } } // namespace mbgl diff --git a/src/mbgl/renderer/sources/render_geojson_source.cpp b/src/mbgl/renderer/sources/render_geojson_source.cpp index 490abe8a6b..4083a96500 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.cpp +++ b/src/mbgl/renderer/sources/render_geojson_source.cpp @@ -118,7 +118,8 @@ void RenderGeoJSONSource::update(Immutable<style::Source::Impl> baseImpl_, [&, data_](const OverscaledTileID& tileID) { return std::make_unique<GeoJSONTile>(tileID, impl().id, parameters, data_); }, - baseImpl->getPrefetchZoomDelta()); + baseImpl->getPrefetchZoomDelta(), + baseImpl->getMaxOverscaleFactorForParentTiles()); } mapbox::util::variant<Value, FeatureCollection> diff --git a/src/mbgl/renderer/sources/render_raster_dem_source.cpp b/src/mbgl/renderer/sources/render_raster_dem_source.cpp index 953484f6c6..9b2345f8e0 100644 --- a/src/mbgl/renderer/sources/render_raster_dem_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_dem_source.cpp @@ -37,7 +37,8 @@ void RenderRasterDEMSource::updateInternal(const Tileset& tileset, tileset.zoomRange, tileset.bounds, [&](const OverscaledTileID& tileID) { return std::make_unique<RasterDEMTile>(tileID, parameters, tileset); }, - baseImpl->getPrefetchZoomDelta()); + baseImpl->getPrefetchZoomDelta(), + baseImpl->getMaxOverscaleFactorForParentTiles()); 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 7ef7b26459..f759623cdd 100644 --- a/src/mbgl/renderer/sources/render_raster_source.cpp +++ b/src/mbgl/renderer/sources/render_raster_source.cpp @@ -35,7 +35,8 @@ void RenderRasterSource::updateInternal(const Tileset& tileset, tileset.zoomRange, tileset.bounds, [&](const OverscaledTileID& tileID) { return std::make_unique<RasterTile>(tileID, parameters, tileset); }, - baseImpl->getPrefetchZoomDelta()); + baseImpl->getPrefetchZoomDelta(), + baseImpl->getMaxOverscaleFactorForParentTiles()); 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 324599d45d..3ac16a136f 100644 --- a/src/mbgl/renderer/sources/render_vector_source.cpp +++ b/src/mbgl/renderer/sources/render_vector_source.cpp @@ -33,7 +33,8 @@ void RenderVectorSource::updateInternal(const Tileset& tileset, [&](const OverscaledTileID& tileID) { return std::make_unique<VectorTile>(tileID, baseImpl->id, parameters, tileset); }, - baseImpl->getPrefetchZoomDelta()); + baseImpl->getPrefetchZoomDelta(), + baseImpl->getMaxOverscaleFactorForParentTiles()); } } // namespace mbgl diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index f7f02f5582..c456bf6e24 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -58,7 +58,8 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l const Range<uint8_t> zoomRange, optional<LatLngBounds> bounds, std::function<std::unique_ptr<Tile>(const OverscaledTileID&)> createTile, - optional<uint8_t> sourcePrefetchZoomDelta) { + const optional<uint8_t>& sourcePrefetchZoomDelta, + const optional<uint8_t>& maxParentTileOverscaleFactor) { // If we need a relayout, abandon any cached tiles; they're now stale. if (needsRelayout) { cache.clear(); @@ -177,13 +178,26 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l renderedTiles.clear(); if (!panTiles.empty()) { - algorithm::updateRenderables(getTileFn, createTileFn, retainTileFn, - [](const UnwrappedTileID&, Tile&) {}, panTiles, zoomRange, panZoom); + algorithm::updateRenderables( + getTileFn, + createTileFn, + retainTileFn, + [](const UnwrappedTileID&, Tile&) {}, + panTiles, + zoomRange, + panZoom, + maxParentTileOverscaleFactor); } - algorithm::updateRenderables(getTileFn, createTileFn, retainTileFn, renderTileFn, - idealTiles, zoomRange, tileZoom); - + algorithm::updateRenderables(getTileFn, + createTileFn, + retainTileFn, + renderTileFn, + idealTiles, + zoomRange, + tileZoom, + maxParentTileOverscaleFactor); + for (auto previouslyRenderedTile : previouslyRenderedTiles) { Tile& tile = previouslyRenderedTile.second; tile.markRenderedPreviously(); diff --git a/src/mbgl/renderer/tile_pyramid.hpp b/src/mbgl/renderer/tile_pyramid.hpp index 5f2bfd1ea9..7dd2ab5341 100644 --- a/src/mbgl/renderer/tile_pyramid.hpp +++ b/src/mbgl/renderer/tile_pyramid.hpp @@ -42,7 +42,8 @@ public: Range<uint8_t> zoomRange, optional<LatLngBounds> bounds, std::function<std::unique_ptr<Tile>(const OverscaledTileID&)> createTile, - optional<uint8_t> sourcePrefetchZoomDelta); + const optional<uint8_t>& sourcePrefetchZoomDelta, + const optional<uint8_t>& maxParentTileOverscaleFactor); const std::map<UnwrappedTileID, std::reference_wrapper<Tile>>& getRenderedTiles() const { return renderedTiles; } Tile* getTile(const OverscaledTileID&); diff --git a/src/mbgl/style/source.cpp b/src/mbgl/style/source.cpp index 644a31dace..51a3c80089 100644 --- a/src/mbgl/style/source.cpp +++ b/src/mbgl/style/source.cpp @@ -43,6 +43,18 @@ optional<uint8_t> Source::getPrefetchZoomDelta() const noexcept { return baseImpl->getPrefetchZoomDelta(); } +void Source::setMaxOverscaleFactorForParentTiles(optional<uint8_t> overscaleFactor) noexcept { + if (getMaxOverscaleFactorForParentTiles() == overscaleFactor) return; + auto newImpl = createMutable(); + newImpl->setMaxOverscaleFactorForParentTiles(std::move(overscaleFactor)); + baseImpl = std::move(newImpl); + observer->onSourceChanged(*this); +} + +optional<uint8_t> Source::getMaxOverscaleFactorForParentTiles() const noexcept { + return baseImpl->getMaxOverscaleFactorForParentTiles(); +} + void Source::dumpDebugLogs() const { Log::Info(Event::General, "Source::id: %s", getID().c_str()); Log::Info(Event::General, "Source::loaded: %d", loaded); diff --git a/src/mbgl/style/source_impl.cpp b/src/mbgl/style/source_impl.cpp index 7f6f633eda..98433a8c86 100644 --- a/src/mbgl/style/source_impl.cpp +++ b/src/mbgl/style/source_impl.cpp @@ -1,8 +1,19 @@ #include <mbgl/style/source_impl.hpp> +#include <mbgl/util/constants.hpp> +#include <mbgl/util/logging.hpp> namespace mbgl { namespace style { +namespace { +void WarnIfOverscaleFactorCapsPrefetchDelta(const optional<uint8_t>& overscale, const optional<uint8_t>& prefetch) { + const uint8_t prefetchDelta = std::max<uint8_t>(util::DEFAULT_PREFETCH_ZOOM_DELTA, prefetch.value_or(0u)); + if (overscale && *overscale < prefetchDelta) { + Log::Warning(Event::Style, "Parent tile overscale factor will cap prefetch delta to %d", int(*overscale)); + } +} +} // namespace + Source::Impl::Impl(SourceType type_, std::string id_) : type(type_), id(std::move(id_)) { @@ -10,11 +21,21 @@ Source::Impl::Impl(SourceType type_, std::string id_) void Source::Impl::setPrefetchZoomDelta(optional<uint8_t> delta) noexcept { prefetchZoomDelta = std::move(delta); + WarnIfOverscaleFactorCapsPrefetchDelta(maxOverscaleFactor, prefetchZoomDelta); } optional<uint8_t> Source::Impl::getPrefetchZoomDelta() const noexcept { return prefetchZoomDelta; } +void Source::Impl::setMaxOverscaleFactorForParentTiles(optional<uint8_t> overscaleFactor) noexcept { + maxOverscaleFactor = std::move(overscaleFactor); + WarnIfOverscaleFactorCapsPrefetchDelta(maxOverscaleFactor, prefetchZoomDelta); +} + +optional<uint8_t> Source::Impl::getMaxOverscaleFactorForParentTiles() const noexcept { + return maxOverscaleFactor; +} + } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/source_impl.hpp b/src/mbgl/style/source_impl.hpp index d2c5d54d10..af8435537a 100644 --- a/src/mbgl/style/source_impl.hpp +++ b/src/mbgl/style/source_impl.hpp @@ -22,10 +22,13 @@ public: virtual optional<std::string> getAttribution() const = 0; void setPrefetchZoomDelta(optional<uint8_t> delta) noexcept; optional<uint8_t> getPrefetchZoomDelta() const noexcept; + void setMaxOverscaleFactorForParentTiles(optional<uint8_t> overscaleFactor) noexcept; + optional<uint8_t> getMaxOverscaleFactorForParentTiles() const noexcept; const SourceType type; const std::string id; optional<uint8_t> prefetchZoomDelta; + optional<uint8_t> maxOverscaleFactor; protected: Impl(SourceType, std::string); |