forked from greensopinion/dart-vector-tile-renderer
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
…reensopinion#4) feat: support caching of `VectorTileFeature`s resolved for a `ThemeLayer`
- Loading branch information
1 parent
5c56e0f
commit 0ca61f0
Showing
7 changed files
with
183 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
import 'package:vector_tile_renderer/src/themes/selector.dart'; | ||
|
||
import '../../vector_tile_renderer.dart'; | ||
|
||
/// Resolver for resolving the features, that are selected by a | ||
/// [TileLayerSelector]. | ||
abstract class LayerFeatureResolver { | ||
/// Resolves and returns the features that the given [selector] selects. | ||
Iterable<LayerFeature> resolveFeatures(TileLayerSelector selector); | ||
} | ||
|
||
/// Default implementation of [LayerFeatureResolver] that resolves | ||
/// features from a [tileset]. | ||
class DefaultThemeLayerFeatureResolver implements LayerFeatureResolver { | ||
DefaultThemeLayerFeatureResolver(this.tileset); | ||
|
||
/// The [Tileset] from which to resolves features. | ||
final Tileset tileset; | ||
|
||
@override | ||
Iterable<LayerFeature> resolveFeatures(TileLayerSelector selector) sync* { | ||
for (final layer in selector.select(tileset)) { | ||
for (final feature in selector.layerSelector.features(layer.features)) { | ||
yield LayerFeature(layer, feature); | ||
} | ||
} | ||
} | ||
} | ||
|
||
/// A [LayerFeatureResolver] that uses another resolver and caches its results. | ||
class CachingThemeLayerFeatureResolver implements LayerFeatureResolver { | ||
CachingThemeLayerFeatureResolver(this._resolver); | ||
|
||
final LayerFeatureResolver _resolver; | ||
|
||
final _cache = <TileLayerSelector, List<LayerFeature>>{}; | ||
|
||
@override | ||
Iterable<LayerFeature> resolveFeatures(TileLayerSelector selector) { | ||
return _cache.putIfAbsent( | ||
selector, | ||
() => _resolver.resolveFeatures(selector).toList(), | ||
); | ||
} | ||
} | ||
|
||
class LayerFeature { | ||
LayerFeature(this.layer, this.feature); | ||
|
||
final VectorTileLayer layer; | ||
final VectorTileFeature feature; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,4 +15,5 @@ dependencies: | |
vector_tile: ^0.3.0 | ||
|
||
dev_dependencies: | ||
benchmark_harness: ^2.0.0 | ||
test: ^1.17.5 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
import 'dart:ui'; | ||
|
||
import 'package:benchmark_harness/benchmark_harness.dart'; | ||
import 'package:vector_tile_renderer/src/constants.dart'; | ||
import 'package:vector_tile_renderer/src/themes/light_theme.dart'; | ||
import 'package:vector_tile_renderer/vector_tile_renderer.dart'; | ||
|
||
import '../src/test_tile.dart'; | ||
|
||
Picture _renderPicture({ | ||
required Theme theme, | ||
required double scale, | ||
required Tileset tileset, | ||
required double zoom, | ||
}) { | ||
assert(scale >= 1 && scale <= 4); | ||
|
||
double size = scale * tileSize; | ||
final rect = Rect.fromLTRB(0, 0, size, size); | ||
|
||
final recorder = PictureRecorder(); | ||
final canvas = Canvas(recorder, rect); | ||
canvas.clipRect(rect); | ||
canvas.scale(scale.toDouble(), scale.toDouble()); | ||
|
||
Renderer(theme: theme).render( | ||
canvas, | ||
tileset, | ||
zoomScaleFactor: scale, | ||
zoom: zoom, | ||
); | ||
|
||
return recorder.endRecording(); | ||
} | ||
|
||
class RenderPicture extends BenchmarkBase { | ||
RenderPicture({ | ||
required this.zoom, | ||
required this.preprocessTile, | ||
}) : super('RenderPicture(' | ||
'zoom: $zoom, ' | ||
'preprocessTile: $preprocessTile' | ||
')'); | ||
|
||
static Future<void> setupAll() async { | ||
testTile = await readTestTile(); | ||
} | ||
|
||
static late final VectorTile testTile; | ||
|
||
final double zoom; | ||
final bool preprocessTile; | ||
|
||
late final Theme theme; | ||
late final Tileset tileset; | ||
|
||
@override | ||
void setup() { | ||
theme = ThemeReader().read(lightThemeData()); | ||
final tileset = Tileset({'openmaptiles': testTile}); | ||
|
||
this.tileset = preprocessTile | ||
? TilesetPreprocessor(theme).preprocess(tileset) | ||
: tileset; | ||
} | ||
|
||
@override | ||
void run() => _renderPicture( | ||
theme: theme, | ||
tileset: tileset, | ||
scale: 1, | ||
zoom: zoom, | ||
); | ||
} | ||
|
||
Future<void> main() async { | ||
await RenderPicture.setupAll(); | ||
|
||
final benchmarks = [ | ||
for (final zoom in <double>[0, 12, 24]) ...[ | ||
RenderPicture(zoom: zoom, preprocessTile: false), | ||
RenderPicture(zoom: zoom, preprocessTile: true), | ||
] | ||
]; | ||
|
||
for (final benchmark in benchmarks) { | ||
benchmark.report(); | ||
} | ||
} |