SAP: don't serialize workspaces and caches.

This commit is contained in:
Crozet Sébastien
2020-11-10 17:04:31 +01:00
parent 0a5cd9bc6e
commit 17cfa1edd2

View File

@@ -376,9 +376,7 @@ impl SAPRegion {
assert_eq!(old.proxy_count, 0); assert_eq!(old.proxy_count, 0);
assert!(old.to_insert.is_empty()); assert!(old.to_insert.is_empty());
debug_assert!(!old.existing_proxies.any()); debug_assert!(!old.existing_proxies.any());
for axis in old.axes.iter() { assert!(old.axes.iter().all(|ax| ax.endpoints.len() == 2));
assert!(axis.endpoints.len() == 2); // Account for sentinels
}
old old
} }
@@ -422,6 +420,7 @@ impl SAPRegion {
if self.update_count > 0 { if self.update_count > 0 {
// Update endpoints. // Update endpoints.
let mut deleted = 0; let mut deleted = 0;
for dim in 0..DIM { for dim in 0..DIM {
self.axes[dim].update_endpoints(dim, proxies, reporting); self.axes[dim].update_endpoints(dim, proxies, reporting);
deleted += self.axes[dim].delete_out_of_bounds_proxies(&mut self.existing_proxies); deleted += self.axes[dim].delete_out_of_bounds_proxies(&mut self.existing_proxies);
@@ -460,8 +459,10 @@ pub struct BroadPhase {
regions: HashMap<Point<i32>, SAPRegion>, regions: HashMap<Point<i32>, SAPRegion>,
removed_colliders: Option<Subscription<RemovedCollider>>, removed_colliders: Option<Subscription<RemovedCollider>>,
deleted_any: bool, deleted_any: bool,
region_pool: Vec<SAPRegion>, #[cfg_attr(feature = "serde-serialize", serde(skip))]
points_to_remove: Vec<Point<i32>>, // Workspace region_pool: Vec<SAPRegion>, // To avoid repeated allocations.
#[cfg_attr(feature = "serde-serialize", serde(skip))]
regions_to_remove: Vec<Point<i32>>, // Workspace
// We could think serializing this workspace is useless. // We could think serializing this workspace is useless.
// It turns out is is important to serialize at least its capacity // It turns out is is important to serialize at least its capacity
// and restore this capacity when deserializing the hashmap. // and restore this capacity when deserializing the hashmap.
@@ -555,7 +556,7 @@ impl BroadPhase {
proxies: Proxies::new(), proxies: Proxies::new(),
regions: HashMap::default(), regions: HashMap::default(),
region_pool: Vec::new(), region_pool: Vec::new(),
points_to_remove: Vec::new(), regions_to_remove: Vec::new(),
reporting: HashMap::default(), reporting: HashMap::default(),
deleted_any: false, deleted_any: false,
} }
@@ -658,6 +659,7 @@ impl BroadPhase {
let regions = &mut self.regions; let regions = &mut self.regions;
let pool = &mut self.region_pool; let pool = &mut self.region_pool;
#[cfg(feature = "dim2")] #[cfg(feature = "dim2")]
for i in start.x..=end.x { for i in start.x..=end.x {
for j in start.y..=end.y { for j in start.y..=end.y {
@@ -691,14 +693,14 @@ impl BroadPhase {
for (point, region) in &mut self.regions { for (point, region) in &mut self.regions {
region.update(&self.proxies, &mut self.reporting); region.update(&self.proxies, &mut self.reporting);
if region.proxy_count == 0 { if region.proxy_count == 0 {
self.points_to_remove.push(*point); self.regions_to_remove.push(*point);
} }
} }
// Remove all the empty regions and store them in the region pool // Remove all the empty regions and store them in the region pool
let regions = &mut self.regions; let regions = &mut self.regions;
self.region_pool.extend( self.region_pool.extend(
self.points_to_remove self.regions_to_remove
.drain(..) .drain(..)
.map(|p| regions.remove(&p).unwrap()), .map(|p| regions.remove(&p).unwrap()),
); );