slightly more cursed less allocations

This commit is contained in:
bgkillas 2025-06-18 15:25:57 -04:00
parent 7c3191f3a7
commit 20d0f65ae9
3 changed files with 64 additions and 43 deletions

View file

@ -390,12 +390,10 @@ impl EntitySync {
.interest_tracker
.handle_interest_request(source, interest_request),
RemoteDes::EntityUpdate(vec) => {
self.dont_kill.extend(
self.remote_models
.entry(source)
.or_insert(RemoteDiffModel::new(source))
.apply_diff(vec),
);
self.remote_models
.entry(source)
.or_insert(RemoteDiffModel::new(source))
.apply_diff(vec);
}
RemoteDes::EntityInit(vec) => {
self.dont_kill.extend(
@ -591,6 +589,7 @@ impl Module for EntitySync {
unreachable!()
};
self.local_diff_model.init_buffer = diff;
self.local_diff_model.uninit();
}
let dead;
(dead, t, self.local_index) = self
@ -624,6 +623,25 @@ impl Module for EntitySync {
)?;
}
}
if !self.local_diff_model.init_buffer.is_empty() {
let res = std::mem::take(&mut self.local_diff_model.init_buffer);
let RemoteDes::EntityInit(diff) = send_remotedes(
ctx,
true,
Destination::Peers(
self.interest_tracker
.iter_interested()
.filter(|p| !new_intersects.contains(p))
.collect(),
),
RemoteDes::EntityInit(res),
)?
else {
unreachable!()
};
self.local_diff_model.init_buffer = diff;
self.local_diff_model.uninit();
}
if !self.local_diff_model.update_buffer.is_empty() {
let res = std::mem::take(&mut self.local_diff_model.update_buffer);
let RemoteDes::EntityUpdate(diff) = send_remotedes(

View file

@ -36,7 +36,7 @@ pub(crate) static DES_SCRIPTS_TAG: &str = "ew_des_lua";
#[derive(Clone)]
struct EntityEntryPair {
last: Option<EntityInfo>,
current: EntityInfo,
current: Option<EntityInfo>,
gid: Gid,
}
@ -96,7 +96,14 @@ impl LocalDiffModel {
.skip(start)
.take(end - start)
.filter_map(|(lid, p)| {
let EntityEntryPair { current, gid, last } = p;
let EntityEntryPair {
current: Some(current),
gid,
last,
} = p
else {
unreachable!()
};
if last.is_some() && !self.dont_save.contains(lid) {
Some(if upload.remove(lid) && !self.dont_upload.contains(lid) {
UpdateOrUpload::Upload(FullEntityData {
@ -129,7 +136,12 @@ impl LocalDiffModel {
})
.collect();
for lid in upload {
if let Some(EntityEntryPair { current, gid, last }) = self.entity_entries.get(&lid) {
if let Some(EntityEntryPair {
current: Some(current),
gid,
last,
}) = self.entity_entries.get(&lid)
{
if !self.dont_upload.contains(&lid) {
if last.is_some() {
res.push(UpdateOrUpload::Upload(FullEntityData {
@ -884,7 +896,7 @@ impl LocalDiffModel {
lid,
EntityEntryPair {
last: None,
current: EntityInfo {
current: Some(EntityInfo {
spawn_info,
kind: entity_kind,
x,
@ -910,7 +922,7 @@ impl LocalDiffModel {
is_enabled: false,
counter: 0,
synced_var: Vec::new(),
},
}),
gid,
},
);
@ -1066,7 +1078,7 @@ impl LocalDiffModel {
};
let drops_gold = if let Some(info) = self.entity_entries.remove(&lid) {
to_untrack.push((info.gid, lid));
info.current.drops_gold
info.current.unwrap().drops_gold
} else {
false
};
@ -1106,7 +1118,7 @@ impl LocalDiffModel {
.update_entity(
ctx,
*gid,
current,
current.as_mut().unwrap(),
lid,
(cam_x, cam_y),
self.upload.contains(&lid) && !self.dont_upload.contains(&lid),
@ -1124,15 +1136,17 @@ impl LocalDiffModel {
self.upload.remove(&lid);
}
let Some(last) = last.as_mut() else {
*last = Some(current.clone());
self.update_buffer
.push(EntityUpdate::Init(Box::from(EntityInit {
info: current.clone(), //TODO technically possible to get rid of
lid,
gid: *gid,
})));
*last = current.clone();
self.init_buffer.push(EntityInit {
info: std::mem::take(current).unwrap(),
lid,
gid: *gid,
});
continue;
};
let Some(current) = current else {
unreachable!()
};
let mut had_any_delta = false;
fn diff<T: PartialEq + Clone, K: Fn() -> EntityUpdate>(
current: &T,
@ -1329,17 +1343,21 @@ impl LocalDiffModel {
Ok((dead, time + tmr.elapsed().as_micros(), end))
}
pub(crate) fn make_init(&mut self) {
self.init_buffer.clear();
for (lid, EntityEntryPair { current, gid, .. }) in self.entity_entries.clone() {
for (lid, EntityEntryPair { current, gid, .. }) in self.entity_entries.iter_mut() {
//res.push(EntityUpdate::CurrentEntity(*lid));
//*last = Some(current.clone());
self.init_buffer.push(EntityInit {
info: current,
lid,
gid,
info: std::mem::take(current).unwrap(),
lid: *lid,
gid: *gid,
});
}
}
pub(crate) fn uninit(&mut self) {
for EntityInit { info, lid, .. } in self.init_buffer.drain(..) {
self.entity_entries.get_mut(&lid).unwrap().current = Some(info);
}
}
pub(crate) fn lid_by_entity(&self, entity: EntityID) -> Option<Lid> {
self.tracker.tracked.get_by_right(&entity).copied()
@ -1358,7 +1376,7 @@ impl LocalDiffModel {
return;
};
if let Ok(entity) = self.tracker.entity_by_lid(lid) {
if info.current.kind == EntityKind::Item {
if info.current.as_ref().unwrap().kind == EntityKind::Item {
self.tracker.pending_localize.push((lid, source));
safe_entitykill(entity);
// "Untrack" entity
@ -1434,7 +1452,7 @@ impl RemoteDiffModel {
self.waiting_for_lid.insert(gid, entity);
}
pub(crate) fn apply_init(&mut self, diff: Vec<EntityInit>) -> Vec<EntityID> {
let mut dont_kill = Vec::new();
let mut dont_kill = Vec::with_capacity(self.waiting_for_lid.len());
for info in diff {
if let Some(ent) = self.waiting_for_lid.remove(&info.gid) {
self.tracked.insert(info.lid, ent);
@ -1446,10 +1464,9 @@ impl RemoteDiffModel {
}
dont_kill
}
pub(crate) fn apply_diff(&mut self, diff: Vec<EntityUpdate>) -> Vec<EntityID> {
pub(crate) fn apply_diff(&mut self, diff: Vec<EntityUpdate>) {
let empty_data = &mut EntityInfo::default();
let mut ent_data = &mut EntityInfo::default();
let mut dont_kill = Vec::new();
let mut is_empty = true;
for entry in diff {
match entry {
@ -1462,17 +1479,6 @@ impl RemoteDiffModel {
is_empty = true;
}
}
EntityUpdate::Init(info) => {
if let Some(ent) = self.waiting_for_lid.remove(&info.gid) {
self.tracked.insert(info.lid, ent);
let _ = init_remote_entity(ent, Some(info.lid), Some(info.gid), false);
dont_kill.push(ent);
}
self.lid_to_gid.insert(info.lid, info.gid);
self.entity_infos.insert(info.lid, info.info);
ent_data = empty_data;
is_empty = true;
}
EntityUpdate::LocalizeEntity(lid, peer_id) => {
if let Some((_, entity)) = self.tracked.remove_by_left(&lid) {
if peer_id != my_peer_id() {
@ -1516,13 +1522,11 @@ impl RemoteDiffModel {
EntityUpdate::KillEntity { .. }
| EntityUpdate::RemoveEntity(_)
| EntityUpdate::CurrentEntity(_)
| EntityUpdate::Init(_)
| EntityUpdate::LocalizeEntity(_, _) => unreachable!(),
},
_ => {}
}
}
dont_kill
}
fn inner(

View file

@ -165,7 +165,6 @@ pub struct EntityInit {
pub enum EntityUpdate {
/// Sets the gid that following EntityUpdates will act on.
CurrentEntity(Lid),
Init(Box<EntityInit>),
// TODO diffing for position
SetPosition(f32, f32),
SetRotation(f32),