Skip to content

Commit

Permalink
eliminate alternative size tiles
Browse files Browse the repository at this point in the history
Eliminate alternative tile size provider
logic since the effect is now covered by
retaining existing tiles until new tiles
have loaded. This eliminates significant
tile re-rendering, making the map less
janky.
  • Loading branch information
greensopinion committed Jan 8, 2022
1 parent 10dd2f4 commit eecec08
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 95 deletions.
3 changes: 0 additions & 3 deletions lib/src/grid/tile_widgets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,6 @@ class TileWidgets extends ChangeNotifier {

void updateWidgets() => _updateWidgets();

bool get hasNewModels => _newModels.isNotEmpty;
bool get hasObsoleteModels => _obsoleteModels.isNotEmpty;

Map<TileIdentity, GridVectorTile> get all => _idToWidget;

void _updateModels(List<TileIdentity> tiles) {
Expand Down
29 changes: 3 additions & 26 deletions lib/src/stream/caches_tile_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,11 @@ class CachesTileProvider extends TileProvider {
@override
Future<Tile> provide(TileIdentity tileIdentity, TileFormat format,
{double? zoom}) async {
final tile =
await _provide(tileIdentity, format, zoom: zoom, onlyIfPresent: false);
if (tile == null) {
throw 'illegal state';
}
return tile;
}

@override
Future<Tile?> provideIfReady(TileIdentity tileIdentity, TileFormat format,
{double? zoom}) =>
_provide(tileIdentity, format, zoom: zoom, onlyIfPresent: true);

@override
Future<Tile?> _provide(TileIdentity tileIdentity, TileFormat format,
{double? zoom, required bool onlyIfPresent}) async {
if (format == TileFormat.vector) {
Map<String, Future<VectorTile?>> futureBySource = {};
Map<String, Future<VectorTile>> futureBySource = {};
for (final source in _caches.providerSources) {
futureBySource[source] = onlyIfPresent
? _caches.vectorTileCache.retrieveIfPresent(source, tileIdentity)
: _caches.vectorTileCache.retrieve(source, tileIdentity);
futureBySource[source] =
_caches.vectorTileCache.retrieve(source, tileIdentity);
}
Map<String, VectorTile> tileBySource = {};
for (final entry in futureBySource.entries) {
Expand All @@ -55,9 +38,6 @@ class CachesTileProvider extends TileProvider {
rethrow;
}
}
if (tile == null) {
return null;
}
tileBySource[entry.key] = tile;
}
return Tile(
Expand All @@ -75,9 +55,6 @@ class CachesTileProvider extends TileProvider {
tileset: null,
image: image);
}
if (onlyIfPresent) {
return null;
}
final tile = await provide(tileIdentity, TileFormat.vector);
final loaded = await _caches.imageTileCache
.retrieve(tile.identity, tile.tileset!, zoom: effectiveZoom);
Expand Down
10 changes: 0 additions & 10 deletions lib/src/stream/preprocessing_tile_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,6 @@ class PreprocessingTileProvider extends TileProvider {
return _preprocess(tile);
}

@override
Future<Tile?> provideIfReady(TileIdentity tileIdentity, TileFormat format,
{double? zoom}) async {
final tile =
await _delegate.provideIfReady(tileIdentity, format, zoom: zoom);
if (tile != null) {
return _preprocess(tile);
}
}

Future<Tile> _preprocess(Tile tile) async {
if (tile.tileset != null) {
return Tile(
Expand Down
66 changes: 12 additions & 54 deletions lib/src/stream/provider_supplier.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'dart:async';
import 'dart:math';

import '../tile_identity.dart';

Expand All @@ -9,7 +8,6 @@ import 'tile_supplier.dart';
class ProviderTileSupplier extends TileSupplier {
final TileProvider _provider;
final SlippyMapTranslator _translator;
final _maxAlternativeLevels = 2;

ProviderTileSupplier(this._provider)
: _translator = SlippyMapTranslator(_provider.maximumZoom);
Expand All @@ -33,65 +31,25 @@ class ProviderTileSupplier extends TileSupplier {

final secondaryFormat = request.secondaryFormat;
if (secondaryFormat != null) {
final readyTile =
await _provideTileOrAlternativeIfReady(request, secondaryFormat);
if (readyTile != null) {
yield readyTile;
final secondary = _provider
.provide(tileId, secondaryFormat, zoom: request.tileId.z.toDouble())
.toCompleter();
if (mainTile.isCompleted) {
yield await mainTile.future;
providedMainTile = true;
}
if (!request.completed &&
(readyTile == null || readyTile.identity.z != tileId.z)) {
final imageTile = _provider
.provide(tileId, secondaryFormat, zoom: request.tileId.z.toDouble())
.toCompleter();
if (mainTile.isCompleted) {
yield await mainTile.future;
providedMainTile = true;
}
yield await imageTile.future;
if (mainTile.isCompleted) {
yield await mainTile.future;
providedMainTile = true;
}
final secondaryTile = await secondary.future;
if (mainTile.isCompleted) {
yield await mainTile.future;
providedMainTile = true;
}
yield secondaryTile;
}
if (!request.completed && !providedMainTile) {
final tileOrAlternative = await _provideTileOrAlternativeIfReady(
request, request.primaryFormat);
if (tileOrAlternative != null) {
yield tileOrAlternative;
providedMainTile = tileOrAlternative.identity.z == tileId.z;
}
if (!request.completed && !providedMainTile) {
yield await mainTile.future;
}
yield await mainTile.future;
}
request.complete();
}

Future<Tile?> _provideTileOrAlternativeIfReady(
TileRequest request, TileFormat format) async {
var startZoom = min(request.tileId.z, maximumZoom);
for (var translationLevel = 0;
translationLevel < _maxAlternativeLevels;
++translationLevel) {
final newZoom = startZoom - translationLevel;
if (newZoom < 1) {
break;
}
final newTranslation =
_translator.specificZoomTranslation(request.tileId, zoom: newZoom);
var tile = await _provider.provideIfReady(
newTranslation.translated, format,
zoom: request.tileId.z.toDouble());
if (tile == null && format == TileFormat.raster && request.tileId.z > 3) {
tile = await _provider.provideIfReady(newTranslation.translated, format,
zoom: (request.tileId.z - 1).toDouble());
}
if (tile != null) {
return tile;
}
}
}
}

extension _FutureExtension<T> on Future<T> {
Expand Down
2 changes: 0 additions & 2 deletions lib/src/stream/tile_supplier.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,4 @@ abstract class TileProvider {
int get maximumZoom;
Future<Tile> provide(TileIdentity tileIdentity, TileFormat format,
{double? zoom});
Future<Tile?> provideIfReady(TileIdentity tileIdentity, TileFormat format,
{double? zoom});
}

0 comments on commit eecec08

Please sign in to comment.