Skip to content

Commit

Permalink
Merge pull request #17 from Zac8668/engine
Browse files Browse the repository at this point in the history
fix: Better performance
  • Loading branch information
Zac8668 authored Dec 31, 2023
2 parents 38f8b9b + f173e8a commit 78b248b
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 64 deletions.
29 changes: 11 additions & 18 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ bevy = "0.12"
bevy-inspector-egui = "0.22"
rand = { version = "0.8.5", features = ["small_rng"] }
fastrand = "2.0.1"
atomicell = "0.2.0"
async-channel = "2.1.0"
smallvec = "1.11.2"
itertools = "0.12.0"
Expand Down
2 changes: 1 addition & 1 deletion src/actors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,6 @@ pub fn move_y(chunk_manager: &mut ChunkManager, actor: &mut Actor, dir: i32) ->
pub struct ActorsPlugin;
impl Plugin for ActorsPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Update, update_actors.after(chunk_manager_update));
app.add_systems(Update, update_actors.after(update_player));
}
}
1 change: 1 addition & 0 deletions src/chunk_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,7 @@ pub fn chunk_manager_update(
&mut chunk_manager.chunks,
&mut mutable_references,
(x_toff, y_toff),
dirty_rects,
);

//Iterate through the center chunks
Expand Down
111 changes: 68 additions & 43 deletions src/manager_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -323,56 +323,81 @@ pub fn updown_to_leftright(
//Some chunks are not chopped others are chopped up/down, left/right, and also in four corners.
//We do this because each center chunk needs half of the adjacent chunks
//So it needs up/down/left/right halves, and also four corners
//TODO Remove HashMap iter; Decrease individual atoms iterations to get a &mut Atom;
//TODO Decrease individual atoms iterations to get a &mut Atom;
pub fn get_mutable_references<'a>(
chunks: &'a mut HashMap<IVec2, Chunk>,
mutable_references: &mut HashMap<IVec2, ChunkReference<'a>>,
thread_off: (usize, usize),
(x_toff, y_toff): (usize, usize),
dirty_rects: &HashMap<IVec2, URect>,
) {
chunks.iter_mut().for_each(|(chunk_pos, chunk)| {
let same_x = (chunk_pos.x as usize + thread_off.0) % 2 == 0;
let same_y = (chunk_pos.y as usize + thread_off.1) % 2 == 0;

match (same_x, same_y) {
(true, true) => {
mutable_references.insert(*chunk_pos, ChunkReference::Center(&mut chunk.atoms));
}
(true, false) => {
let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2);

mutable_references.insert(
*chunk_pos,
ChunkReference::Side([
Some(up.iter_mut().collect::<Vec<_>>().try_into().unwrap()),
Some(down.iter_mut().collect::<Vec<_>>().try_into().unwrap()),
]),
);
}
(false, true) => {
let (left, right) = split_left_right(&mut chunk.atoms);

mutable_references
.insert(*chunk_pos, ChunkReference::Side([Some(left), Some(right)]));
chunks
.iter_mut()
.filter(|(chunk_pos, _)| {
let same_x = chunk_pos.x % 2 == x_toff as i32;
let same_y = chunk_pos.y % 2 == y_toff as i32;
let step_as_center = same_x && same_y;
if step_as_center && dirty_rects.contains_key(*chunk_pos) {
return true;
} else if !step_as_center {
let to_check = match (same_x, same_y) {
(false, false) => vec![ivec2(-1, -1), ivec2(-1, 1), ivec2(1, -1), ivec2(1, 1)],
(true, false) => vec![ivec2(0, -1), ivec2(0, 1)],
(false, true) => vec![ivec2(-1, 0), ivec2(1, 0)],
_ => unreachable!(),
};
for vec in to_check {
if dirty_rects.contains_key(&(**chunk_pos + vec)) {
return true;
}
}
}

(false, false) => {
let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2);

let (up_left, up_right) = updown_to_leftright(up);
let (down_left, down_right) = updown_to_leftright(down);

mutable_references.insert(
*chunk_pos,
ChunkReference::Corner([
Some(up_left),
Some(up_right),
Some(down_left),
Some(down_right),
]),
);
false
})
.for_each(|(chunk_pos, chunk)| {
let same_x = (chunk_pos.x as usize + x_toff) % 2 == 0;
let same_y = (chunk_pos.y as usize + y_toff) % 2 == 0;

match (same_x, same_y) {
(true, true) => {
mutable_references.insert(*chunk_pos, ChunkReference::Center(&mut chunk.atoms));
}
(true, false) => {
let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2);

mutable_references.insert(
*chunk_pos,
ChunkReference::Side([
Some(up.iter_mut().collect::<Vec<_>>().try_into().unwrap()),
Some(down.iter_mut().collect::<Vec<_>>().try_into().unwrap()),
]),
);
}
(false, true) => {
let (left, right) = split_left_right(&mut chunk.atoms);

mutable_references
.insert(*chunk_pos, ChunkReference::Side([Some(left), Some(right)]));
}

(false, false) => {
let (up, down) = chunk.atoms.split_at_mut(CHUNK_LEN / 2);

let (up_left, up_right) = updown_to_leftright(up);
let (down_left, down_right) = updown_to_leftright(down);

mutable_references.insert(
*chunk_pos,
ChunkReference::Corner([
Some(up_left),
Some(up_right),
Some(down_left),
Some(down_right),
]),
);
}
}
}
});
});
}

pub fn update_dirty_rects(dirty_rects: &mut HashMap<IVec2, URect>, pos: ChunkPos) {
Expand Down
2 changes: 1 addition & 1 deletion src/player.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ impl Plugin for PlayerPlugin {
app.add_systems(
Update,
(
update_player.before(update_actors),
update_player.before(chunk_manager_update),
update_player_sprite.after(update_actors),
),
)
Expand Down

0 comments on commit 78b248b

Please sign in to comment.