From ee2229b59094d7d96fc9f16ae2f6c2afd0da3bba Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Sat, 3 Aug 2024 00:19:54 -0500 Subject: [PATCH] Things work, but there seems to be a weird performance issue --- src/main.rs | 76 +++++++++++++++++++++++++-------------------------- src/map.rs | 55 ++++++++++++++++++++----------------- src/player.rs | 4 +++ 3 files changed, 71 insertions(+), 64 deletions(-) diff --git a/src/main.rs b/src/main.rs index a9ba240..c78f724 100644 --- a/src/main.rs +++ b/src/main.rs @@ -93,46 +93,44 @@ fn main() -> AppExit { app.add_event::(); - app.add_systems( - OnEnter(View::LoadingMenu), - ((startup, camera::startup), main_menu::startup), - ) - .add_systems(OnExit(View::MainMenu), main_menu::exit) - .add_systems( - OnEnter(View::LoadingGame), - (player::startup, statue::startup, map::init), - ) - .add_systems( - OnExit(View::InGame), - (player::exit, statue::exit, map::exit), - ) - .add_systems( - Update, - ( - load_menu.run_if(in_state(View::LoadingMenu)), - load_game.run_if(in_state(View::LoadingGame)), - map::tile_loaders.run_if(in_state(View::LoadingGame)), - input::process_input, - (update,).after(input::process_input), + app.add_systems(Startup, (startup, camera::startup)); + app.add_systems(OnEnter(View::LoadingMenu), (main_menu::startup,)) + .add_systems(OnExit(View::MainMenu), main_menu::exit) + .add_systems( + OnEnter(View::LoadingGame), + (player::startup, statue::startup, map::init), + ) + .add_systems( + OnExit(View::InGame), + (player::exit, statue::exit, map::exit), + ) + .add_systems( + Update, ( - // map::update, - player::control, - player::meow_on_r, - player::player_debug_info, - statue::spawn_statue, - movement::update_velocity_by_heading, - movement::resolve_velocity.after(movement::update_velocity_by_heading), - movement::ysort.after(movement::update_velocity_by_heading), - camera::update - .after(player::control) - .after(movement::resolve_velocity), - ) - .after(input::process_input) - .in_set(InGameSet), - (main_menu::update).in_set(MainMenuSet), - ), - ) - .insert_resource(ClearColor(Color::srgb(0.3, 0.1, 0.5))); + load_menu.run_if(in_state(View::LoadingMenu)), + load_game.run_if(in_state(View::LoadingGame)), + map::tile_loaders.run_if(in_state(View::LoadingGame)), + input::process_input, + (update,).after(input::process_input), + ( + // map::update, + player::control, + player::meow_on_r, + player::player_debug_info, + statue::spawn_statue, + movement::update_velocity_by_heading, + movement::resolve_velocity.after(movement::update_velocity_by_heading), + movement::ysort.after(movement::update_velocity_by_heading), + camera::update + .after(player::control) + .after(movement::resolve_velocity), + ) + .after(input::process_input) + .in_set(InGameSet), + (main_menu::update).in_set(MainMenuSet), + ), + ) + .insert_resource(ClearColor(Color::srgb(0.3, 0.1, 0.5))); app.run() } diff --git a/src/map.rs b/src/map.rs index 9f8942f..64cb0b5 100644 --- a/src/map.rs +++ b/src/map.rs @@ -73,47 +73,52 @@ pub fn init(mut commands: Commands, assets: Res) { .insert((TileInit(task), TileChan(Mutex::new(rx)))); } +const MAX_TILES_TO_LOAD_IN_ONE_UPDATE: usize = 5_000; pub fn tile_loaders( mut commands: Commands, - mut query: Query<(Entity, &mut TileStorage, &TileChan), With>, + mut query: Query<(Entity, &mut TileStorage), With>, + mut chan: Query<&TileChan, With>, mut tasks: Query<&mut TileInit>, mut app_state: ResMut>, ) { // TODO: to avoid locking up the universe we only want to handle a certain number per iteration (Update) - let (tilemap, mut storage, chan) = query.single_mut(); - let chan = chan.0.lock().unwrap(); - let mut counter = 0; - let mut tiles_done = false; - loop { - match chan.recv() { - Ok(ev) => { - let ref_position = &ev.position; - let tile = commands.spawn((HideFromInspector, ev)).id(); - storage.set(ref_position, tile); - counter += 1; - if counter > 5_000 { - info!("Finished 100k!"); + let mut tiles_done = true; + let (tilemap, mut storage) = query.single_mut(); + + if let Ok(chan) = chan.get_single_mut() { + let chan = chan.0.lock().unwrap(); + tiles_done = false; + let mut counter = 0; + loop { + match chan.recv() { + Ok(ev) => { + let ref_position = &ev.position; + let tile = commands.spawn((HideFromInspector, ev)).id(); + storage.set(ref_position, tile); + counter += 1; + if counter >= MAX_TILES_TO_LOAD_IN_ONE_UPDATE { + info!("Finished {}!", counter); + break; + } + } + Err(_) => { + commands.entity(tilemap).remove::(); + if counter > 0 { + info!("Finished {counter}! Probably finishing mapgen soon..."); + } + // the channel is likely closed, so let's note that and be done + tiles_done = true; break; } } - Err(err) => { - error!("{err:#?}"); - tiles_done = true; - break; - } } } - info!("Task: {tasks:#?}"); for mut task in &mut tasks { let poll = future::poll_once(&mut task.0); - info!("Poll: {poll:#?}"); if block_on(poll).is_some() { + // task is done, remove it so we don't poll it again commands.entity(tilemap).remove::(); - // need to check if the map is fully loaded before switching - // app_state.set(View::InGame); - // TODO: transition to game? - info!("poll was some"); } } if tasks.iter().peekable().peek().is_none() && tiles_done { diff --git a/src/player.rs b/src/player.rs index 48da0f9..a3570fd 100644 --- a/src/player.rs +++ b/src/player.rs @@ -84,6 +84,10 @@ pub fn startup( .spawn(( Crosshair, Name::new("Crosshair"), + VisibilityBundle { + visibility: Visibility::Inherited, + ..default() + }, TransformBundle { local: transform, ..default()