mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-23 08:11:33 +11:00
Resolve stutter upon switching to dice customise screen (#442)
1. Dealloc now uses the normal dealloc procedure. * Better because normalisation is quick, O(1). * More normalisation means inserting into the list is faster. 2. Run sfx frame during the generation of upgrades (which can take an unbounded amount of time). * Both of these are required to remove the stuttering. * It sounds really weird now that it works right :/ - [ ] Changelog updated / no changelog update needed
This commit is contained in:
commit
28e3a7faf4
|
@ -85,12 +85,6 @@ impl BlockAllocator {
|
||||||
self.with_inner(|inner| inner.dealloc(ptr, layout));
|
self.with_inner(|inner| inner.dealloc(ptr, layout));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn dealloc_no_normalise(&self, ptr: *mut u8, layout: Layout) {
|
|
||||||
self.with_inner(|inner| {
|
|
||||||
inner.dealloc_no_normalise(ptr, layout);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
pub unsafe fn grow(
|
pub unsafe fn grow(
|
||||||
&self,
|
&self,
|
||||||
ptr: *mut u8,
|
ptr: *mut u8,
|
||||||
|
|
|
@ -342,7 +342,7 @@ impl VRamManager {
|
||||||
|
|
||||||
let tile_reference = Self::reference_from_index(tile_index);
|
let tile_reference = Self::reference_from_index(tile_index);
|
||||||
unsafe {
|
unsafe {
|
||||||
TILE_ALLOCATOR.dealloc_no_normalise(
|
TILE_ALLOCATOR.dealloc(
|
||||||
tile_reference.0.cast().as_ptr(),
|
tile_reference.0.cast().as_ptr(),
|
||||||
layout_of(tile_index.format()),
|
layout_of(tile_index.format()),
|
||||||
);
|
);
|
||||||
|
|
|
@ -175,7 +175,7 @@ pub(crate) fn customise_screen(
|
||||||
|
|
||||||
agb.sfx.frame();
|
agb.sfx.frame();
|
||||||
|
|
||||||
let mut upgrades = crate::level_generation::generate_upgrades(level);
|
let mut upgrades = crate::level_generation::generate_upgrades(level, &mut || agb.sfx.frame());
|
||||||
let mut _upgrade_objects = create_upgrade_objects(&agb.obj, &upgrades);
|
let mut _upgrade_objects = create_upgrade_objects(&agb.obj, &upgrades);
|
||||||
|
|
||||||
let mut input = agb::input::ButtonController::new();
|
let mut input = agb::input::ButtonController::new();
|
||||||
|
|
|
@ -92,7 +92,7 @@ fn generate_cooldown(current_level: u32) -> u32 {
|
||||||
rng::gen().rem_euclid((5 * 60 - current_level as i32 * 10).max(1)) as u32 + 2 * 60
|
rng::gen().rem_euclid((5 * 60 - current_level as i32 * 10).max(1)) as u32 + 2 * 60
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_upgrades(level: u32) -> Vec<Face> {
|
pub fn generate_upgrades(level: u32, call: &mut dyn FnMut()) -> Vec<Face> {
|
||||||
let mut upgrade_values = HashMap::new();
|
let mut upgrade_values = HashMap::new();
|
||||||
|
|
||||||
upgrade_values.insert(Face::Shoot, 5);
|
upgrade_values.insert(Face::Shoot, 5);
|
||||||
|
@ -128,6 +128,8 @@ pub fn generate_upgrades(level: u32) -> Vec<Face> {
|
||||||
let mut attempts = 0;
|
let mut attempts = 0;
|
||||||
|
|
||||||
while upgrades.len() != 3 {
|
while upgrades.len() != 3 {
|
||||||
|
call();
|
||||||
|
|
||||||
attempts += 1;
|
attempts += 1;
|
||||||
let next = potential_upgrades[rng::gen() as usize % potential_upgrades.len()];
|
let next = potential_upgrades[rng::gen() as usize % potential_upgrades.len()];
|
||||||
let number_of_malfunctions = upgrades
|
let number_of_malfunctions = upgrades
|
||||||
|
@ -144,6 +146,7 @@ pub fn generate_upgrades(level: u32) -> Vec<Face> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if attempts > 100 {
|
if attempts > 100 {
|
||||||
|
attempts = 0;
|
||||||
upgrades.clear();
|
upgrades.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue