Optimize tessellate_layers

This commit is contained in:
Maximilian Ammann 2022-03-25 20:52:54 +01:00
parent 53021bdbb2
commit 491c7945d4

View File

@ -82,22 +82,23 @@ impl ThreadLocalTessellatorState {
request_id: TileRequestID, request_id: TileRequestID,
data: Box<[u8]>, data: Box<[u8]>,
) -> Result<(), SendError<TileTessellateResult>> { ) -> Result<(), SendError<TileTessellateResult>> {
if let Ok(tile_request_state) = self.tile_request_state.lock() { if let Some(tile_request) = self
if let Some(tile_request) = tile_request_state.get_tile_request(request_id) { .tile_request_state
self.tessellate_layers_with_request( .lock()
TileFetchResult::Tile { .ok()
coords: tile_request.coords, .and_then(|tile_request_state| tile_request_state.get_tile_request(request_id))
data, {
}, self.tessellate_layers_with_request(
&tile_request, TileFetchResult::Tile {
request_id, coords: tile_request.coords,
) data,
} else { },
Ok(()) &tile_request,
} request_id,
} else { )?;
Ok(())
} }
Ok(())
} }
fn tessellate_layers_with_request( fn tessellate_layers_with_request(
@ -191,16 +192,15 @@ impl IOScheduler {
} }
pub fn try_populate_cache(&mut self) { pub fn try_populate_cache(&mut self) {
if let Ok(result) = self.result_receiver.try_recv() { if let Ok(mut tile_request_state) = self.tile_request_state.try_lock() {
match result { if let Ok(result) = self.result_receiver.try_recv() {
TileTessellateResult::Tile { request_id } => loop { match result {
if let Ok(mut tile_request_state) = self.tile_request_state.try_lock() { TileTessellateResult::Tile { request_id } => {
tile_request_state.finish_tile_request(request_id); tile_request_state.finish_tile_request(request_id);
break;
} }
}, TileTessellateResult::Layer(layer_result) => {
TileTessellateResult::Layer(layer_result) => { self.tile_cache.push(layer_result);
self.tile_cache.push(layer_result); }
} }
} }
} }
@ -219,6 +219,8 @@ impl IOScheduler {
) -> Result<(), SendError<TileRequest>> { ) -> Result<(), SendError<TileRequest>> {
let TileRequest { coords, layers } = &tile_request; let TileRequest { coords, layers } = &tile_request;
// TODO: Optimize: Dropping TileRequest is expensive
if !self.tile_cache.is_layers_missing(coords, layers) { if !self.tile_cache.is_layers_missing(coords, layers) {
return Ok(()); return Ok(());
} }