diff options
author | Thiago Marcos P. Santos <thiago@mapbox.com> | 2017-01-15 11:27:52 -0500 |
---|---|---|
committer | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2017-07-07 14:28:52 +0300 |
commit | 407fbc70b1dc6dab6b7aa5a4b9c57b4e08906c79 (patch) | |
tree | 1914348d4136449842822f092eaff7d589861e35 /src/mbgl/renderer/tile_pyramid.cpp | |
parent | 2876db72f2d235a02e5670329c4f8dcb2a65a8ed (diff) | |
download | qtlocation-mapboxgl-407fbc70b1dc6dab6b7aa5a4b9c57b4e08906c79.tar.gz |
[core] Prefetch low resolution tiles
Diffstat (limited to 'src/mbgl/renderer/tile_pyramid.cpp')
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.cpp | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp index caf55d64e8..a8e6c128ba 100644 --- a/src/mbgl/renderer/tile_pyramid.cpp +++ b/src/mbgl/renderer/tile_pyramid.cpp @@ -88,14 +88,30 @@ void TilePyramid::update(const std::vector<Immutable<style::Layer::Impl>>& layer // Determine the overzooming/underzooming amounts and required tiles. int32_t overscaledZoom = util::coveringZoomLevel(parameters.transformState.getZoom(), type, tileSize); int32_t tileZoom = overscaledZoom; + int32_t panZoom = zoomRange.max; std::vector<UnwrappedTileID> idealTiles; + std::vector<UnwrappedTileID> panTiles; + if (overscaledZoom >= zoomRange.min) { int32_t idealZoom = std::min<int32_t>(zoomRange.max, overscaledZoom); // Make sure we're not reparsing overzoomed raster tiles. if (type == SourceType::Raster) { tileZoom = idealZoom; + + // FIXME: Prefetching is only enabled for raster + // tiles until we fix #7026. + + // Request lower zoom level tiles (if configure 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); + } + + if (panZoom < tileZoom) { + panTiles = util::tileCover(parameters.transformState, panZoom); + } } idealTiles = util::tileCover(parameters.transformState, idealZoom); @@ -108,8 +124,10 @@ void TilePyramid::update(const std::vector<Immutable<style::Layer::Impl>>& layer std::set<OverscaledTileID> retain; auto retainTileFn = [&](Tile& tile, Resource::Necessity necessity) -> void { - retain.emplace(tile.id); - tile.setNecessity(necessity); + if (retain.emplace(tile.id).second) { + tile.setNecessity(necessity); + } + if (needsRelayout) { tile.setLayers(layers); } @@ -137,6 +155,12 @@ void TilePyramid::update(const std::vector<Immutable<style::Layer::Impl>>& layer }; renderTiles.clear(); + + if (!panTiles.empty()) { + algorithm::updateRenderables(getTileFn, createTileFn, retainTileFn, + [](const UnwrappedTileID&, Tile&) {}, panTiles, zoomRange, panZoom); + } + algorithm::updateRenderables(getTileFn, createTileFn, retainTileFn, renderTileFn, idealTiles, zoomRange, tileZoom); |