Optimize upload loop

This commit is contained in:
Maximilian Ammann 2022-03-27 15:49:37 +02:00
parent aa302f0b27
commit 38db846a7e
5 changed files with 25 additions and 33 deletions

View File

@ -215,21 +215,19 @@ impl IOScheduler {
pub fn try_request_tile(
&mut self,
tile_request: TileRequest,
coords: &WorldTileCoords,
layers: &HashSet<String>,
) -> Result<(), SendError<TileRequest>> {
let TileRequest { coords, layers } = &tile_request;
// TODO: Optimize: Dropping TileRequest is expensive
if !self.tile_cache.is_layers_missing(coords, layers) {
return Ok(());
}
if let Ok(mut tile_request_state) = self.tile_request_state.try_lock() {
let tile_coords = *coords;
if let Some(id) = tile_request_state.start_tile_request(tile_request) {
if let Some(tile_coords) = tile_coords.into_tile(TileAddressingScheme::TMS) {
if let Some(id) = tile_request_state.start_tile_request(TileRequest {
coords: *coords,
layers: layers.clone(),
}) {
if let Some(tile_coords) = coords.into_tile(TileAddressingScheme::TMS) {
info!("new tile request: {}", &tile_coords);
self.schedule_method
@ -244,8 +242,8 @@ impl IOScheduler {
pub fn get_tessellated_layers_at(
&self,
coords: &WorldTileCoords,
skip_layers: &HashSet<String>,
) -> Vec<LayerResult> {
skip_layers: &HashSet<&str>,
) -> Vec<&LayerResult> {
self.tile_cache
.get_tessellated_layers_at(coords, skip_layers)
}

View File

@ -28,14 +28,14 @@ impl TileCache {
pub fn get_tessellated_layers_at(
&self,
coords: &WorldTileCoords,
skip_layers: &HashSet<String>,
) -> Vec<LayerResult> {
let mut ret = Vec::new();
skip_layers: &HashSet<&str>,
) -> Vec<&LayerResult> {
let mut ret = Vec::with_capacity(10);
if let Some(results) = self.index.get(&coords.build_quad_key()) {
for result in results {
if !skip_layers.contains(&result.layer_name().to_string()) {
ret.push(result.clone());
if !skip_layers.contains(&result.layer_name()) {
ret.push(result);
}
}
}

View File

@ -134,13 +134,15 @@ impl<Q: Queue<B>, B, V: bytemuck::Pod, I: bytemuck::Pod, TM: bytemuck::Pod, FM:
}
/// FIXME: use an id instead of layer_name to identify tiles
pub fn get_loaded_layers_at(&self, coords: &WorldTileCoords) -> HashSet<String> {
self.index
.get_layers(coords)
.unwrap_or(&VecDeque::new())
.iter()
.map(|entry| entry.style_layer.source_layer.as_ref().unwrap().clone())
.collect()
pub fn get_loaded_layers_at(&self, coords: &WorldTileCoords) -> HashSet<&str> {
if let Some(layers) = self.index.get_layers(coords) {
layers
.iter()
.map(|entry| entry.style_layer.source_layer.as_ref().unwrap().as_str())
.collect()
} else {
HashSet::new()
}
}
/// Allocates

View File

@ -371,11 +371,7 @@ impl RenderState {
.collect();
for coords in view_region.iter() {
let tile_request = TileRequest {
coords,
layers: source_layers.clone(), // TODO: Optimize: This is expensive
};
scheduler.try_request_tile(tile_request).unwrap();
scheduler.try_request_tile(&coords, &source_layers).unwrap();
}
}
@ -418,7 +414,6 @@ impl RenderState {
for world_coords in view_region.iter() {
let loaded_layers = self.buffer_pool.get_loaded_layers_at(&world_coords);
// TODO: Optimize: Dropping this is expensive
let available_layers =
scheduler.get_tessellated_layers_at(&world_coords, &loaded_layers);

View File

@ -92,10 +92,7 @@ module.exports = (env) => ({
//
// the mode `development` makes `wasm-pack` build in `debug` mode.
// the mode `production` makes `wasm-pack` build in `release` mode.
// TODO: We always build a production build because a development build runs slow
// TODO: The function which is slowing it down is TileProto::decode() which maps the tile proto struct
// TODO: into our data structure. (Development: 15s, Production: 60ms)
forceMode: "production",
// forceMode: "production",
// Controls plugin output verbosity, either 'info' or 'error'.
// Defaults to 'info'.