prepareTiles method
Prepares all tiles for this sub-file by processing the POIs and ways in parallel isolates.
Implementation
Future<void> prepareTiles(bool debugFile, int instanceCount) async {
var session = PerformanceProfiler().startSession(category: "SubfileCreator.prepareTiles");
List<String> languagesPreferences = [];
if (mapHeaderInfo.languagesPreference != null) languagesPreferences.addAll(mapHeaderInfo.languagesPreference!.split(","));
// each instance must process this number of consecutive tiles
// makes no sense to create multiple isolates for so few tiles
if (tileCount <= 100) instanceCount = 1;
// too many tiles (hence too many ways). Danger of OutOfMemory Exception
//if (tileCount > 50000 && instanceCount > 2) instanceCount = 2;
List<ITileWriter> tileWriters = await createTileWriters(_minY, instanceCount, debugFile, languagesPreferences);
// the isolates now hove the infos, we can remove them from memory here
List<Future> futures = [];
int current = 0;
await _processAsync(
"preparing tiles",
(tile) async {
Future future = _future(tileWriters[current], tile);
futures.add(future);
++current;
if (current >= instanceCount) {
current = 0;
}
if (futures.length > 20) {
await Future.wait(futures);
futures.clear();
}
},
(int currentTileY, int processedTiles, int sumTiles) async {
// wait until all futures are completed and write the results to the tileBuffer
await Future.wait(futures);
futures.clear();
if (tileCount > 100) {
if (currentTileY > _minY && (currentTileY % 5 == 0)) {
// remove data from previous lines (y)
Tile tile1 = Tile(_minX, _minY, baseZoomLevel, 0);
Tile tile2 = Tile(_maxX, currentTileY - 1, baseZoomLevel, 0);
BoundingBox tileBoundingBox = tile1.getBoundingBox().extendBoundingBox(tile2.getBoundingBox());
await filter.remove(_poiWayCollections, tileBoundingBox);
}
// destroy old writers and build writers with prefiltered data for the next line
for (var tileWriter in tileWriters) {
tileWriter.dispose();
}
tileWriters.clear();
if (currentTileY < _maxY) {
tileWriters = await createTileWriters(currentTileY + 1, instanceCount, debugFile, languagesPreferences);
}
}
},
);
await _poiWayCollections.clear();
await _tileBuffer.writeComplete();
session.complete();
}