[core] Override default prefetch delta if source has it's own setting

This commit is contained in:
Alexander Shalamov
2020-02-10 22:29:11 +02:00
parent fce4129435
commit def38cf4db
9 changed files with 94 additions and 81 deletions

View File

@@ -28,19 +28,19 @@ void RenderAnnotationSource::update(Immutable<style::Source::Impl> 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<LatLngBounds> {},
[&] (const OverscaledTileID& tileID) {
return std::make_unique<AnnotationTile>(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<LatLngBounds>{},
[&](const OverscaledTileID& tileID) { return std::make_unique<AnnotationTile>(tileID, parameters); },
baseImpl->getPrefetchZoomDelta());
}
std::unordered_map<std::string, std::vector<Feature>>

View File

@@ -33,17 +33,20 @@ void RenderCustomGeometrySource::update(Immutable<style::Source::Impl> baseImpl_
return;
}
tilePyramid.update(layers,
needsRendering,
needsRelayout,
parameters,
SourceType::CustomVector,
util::tileSize,
impl().getZoomRange(),
{},
[&] (const OverscaledTileID& tileID) {
return std::make_unique<CustomGeometryTile>(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<CustomGeometryTile>(
tileID, impl().id, parameters, impl().getTileOptions(), *tileLoader);
},
baseImpl->getPrefetchZoomDelta());
}
} // namespace mbgl

View File

@@ -103,17 +103,19 @@ void RenderGeoJSONSource::update(Immutable<style::Source::Impl> baseImpl_,
if (!data_) return;
tilePyramid.update(layers,
needsRendering,
needsRelayout,
parameters,
SourceType::GeoJSON,
util::tileSize,
impl().getZoomRange(),
optional<LatLngBounds>{},
[&, data_](const OverscaledTileID& tileID) {
return std::make_unique<GeoJSONTile>(tileID, impl().id, parameters, data_);
});
tilePyramid.update(
layers,
needsRendering,
needsRelayout,
parameters,
SourceType::GeoJSON,
util::tileSize,
impl().getZoomRange(),
optional<LatLngBounds>{},
[&, data_](const OverscaledTileID& tileID) {
return std::make_unique<GeoJSONTile>(tileID, impl().id, parameters, data_);
},
baseImpl->getPrefetchZoomDelta());
}
mapbox::util::variant<Value, FeatureCollection>

View File

@@ -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<RasterDEMTile>(tileID, parameters, tileset);
});
tilePyramid.update(
layers,
needsRendering,
needsRelayout,
parameters,
SourceType::RasterDEM,
impl().getTileSize(),
tileset.zoomRange,
tileset.bounds,
[&](const OverscaledTileID& tileID) { return std::make_unique<RasterDEMTile>(tileID, parameters, tileset); },
baseImpl->getPrefetchZoomDelta());
algorithm::updateTileMasks(tilePyramid.getRenderedTiles());
}

View File

@@ -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<RasterTile>(tileID, parameters, tileset);
});
tilePyramid.update(
layers,
needsRendering,
needsRelayout,
parameters,
SourceType::Raster,
impl().getTileSize(),
tileset.zoomRange,
tileset.bounds,
[&](const OverscaledTileID& tileID) { return std::make_unique<RasterTile>(tileID, parameters, tileset); },
baseImpl->getPrefetchZoomDelta());
algorithm::updateTileMasks(tilePyramid.getRenderedTiles());
}

View File

@@ -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<VectorTile>(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<VectorTile>(tileID, baseImpl->id, parameters, tileset);
},
baseImpl->getPrefetchZoomDelta());
}
} // namespace mbgl

View File

@@ -57,7 +57,8 @@ void TilePyramid::update(const std::vector<Immutable<style::LayerProperties>>& l
const uint16_t tileSize,
const Range<uint8_t> zoomRange,
optional<LatLngBounds> bounds,
std::function<std::unique_ptr<Tile> (const OverscaledTileID&)> createTile) {
std::function<std::unique_ptr<Tile>(const OverscaledTileID&)> createTile,
optional<uint8_t> 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<Immutable<style::LayerProperties>>& 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<int32_t>(tileZoom - parameters.prefetchZoomDelta, zoomRange.min);
const uint8_t prefetchZoomDelta =
sourcePrefetchZoomDelta ? *sourcePrefetchZoomDelta : parameters.prefetchZoomDelta;
if (prefetchZoomDelta) {
panZoom = std::max<int32_t>(tileZoom - prefetchZoomDelta, zoomRange.min);
}
if (panZoom < idealZoom) {

View File

@@ -41,7 +41,8 @@ public:
uint16_t tileSize,
Range<uint8_t> zoomRange,
optional<LatLngBounds> bounds,
std::function<std::unique_ptr<Tile> (const OverscaledTileID&)> createTile);
std::function<std::unique_ptr<Tile>(const OverscaledTileID&)> createTile,
optional<uint8_t> sourcePrefetchZoomDelta);
const std::map<UnwrappedTileID, std::reference_wrapper<Tile>>& getRenderedTiles() const { return renderedTiles; }
Tile* getTile(const OverscaledTileID&);

View File

@@ -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<FakeTile>(*this, tileID); });
tilePyramid.update(
layers,
needsRendering,
needsRelayout,
parameters,
SourceType::Vector,
util::tileSize,
tileset.zoomRange,
tileset.bounds,
[&](const OverscaledTileID& tileID) { return std::make_unique<FakeTile>(*this, tileID); },
baseImpl->getPrefetchZoomDelta());
}
const optional<Tileset>& getTileset() const override {