mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 12:43:34 +00:00
Fix table reserve logic (#1698)
Fixes #1692 Alternative to #1696 This ensures that the capacity actually grows in increments of grow_amount, and also ensures that Table capacity is always <= column and entity vec capacity. Debug logs that describe the new logic (running the example in #1692) [out.txt](https://github.com/bevyengine/bevy/files/6173808/out.txt)
This commit is contained in:
parent
c78b76bba8
commit
b6be8a5314
1 changed files with 7 additions and 2 deletions
|
@ -327,12 +327,17 @@ impl Table {
|
||||||
pub fn reserve(&mut self, amount: usize) {
|
pub fn reserve(&mut self, amount: usize) {
|
||||||
let available_space = self.capacity - self.len();
|
let available_space = self.capacity - self.len();
|
||||||
if available_space < amount {
|
if available_space < amount {
|
||||||
let reserve_amount = (amount - available_space).max(self.grow_amount);
|
let min_capacity = self.len() + amount;
|
||||||
|
// normally we would check if min_capacity is 0 for the below calculation, but amount > available_space and
|
||||||
|
// available_space > 0, so min_capacity > 1
|
||||||
|
let new_capacity =
|
||||||
|
((min_capacity + self.grow_amount - 1) / self.grow_amount) * self.grow_amount;
|
||||||
|
let reserve_amount = new_capacity - self.len();
|
||||||
for column in self.columns.values_mut() {
|
for column in self.columns.values_mut() {
|
||||||
column.reserve(reserve_amount);
|
column.reserve(reserve_amount);
|
||||||
}
|
}
|
||||||
self.entities.reserve(reserve_amount);
|
self.entities.reserve(reserve_amount);
|
||||||
self.capacity += reserve_amount;
|
self.capacity = new_capacity;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue