mirror of
https://github.com/italicsjenga/agb.git
synced 2025-02-23 22:58:18 +11:00
Add a gc step in commit
This commit is contained in:
parent
a562a4f600
commit
7688316034
9 changed files with 36 additions and 23 deletions
|
@ -33,7 +33,7 @@ fn main(mut gba: agb::Gba) -> ! {
|
|||
}
|
||||
}
|
||||
|
||||
bg.commit();
|
||||
bg.commit(&mut vram);
|
||||
bg.show();
|
||||
|
||||
let mut i = 0;
|
||||
|
|
|
@ -67,7 +67,7 @@ fn main(mut gba: agb::Gba) -> ! {
|
|||
}
|
||||
|
||||
background.show();
|
||||
background.commit();
|
||||
background.commit(&mut vram);
|
||||
|
||||
let object = gba.display.object.get();
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ fn main(mut gba: agb::Gba) -> ! {
|
|||
}
|
||||
}
|
||||
|
||||
bg.commit();
|
||||
bg.commit(&mut vram);
|
||||
bg.show();
|
||||
|
||||
loop {
|
||||
|
|
|
@ -44,20 +44,20 @@ fn main(mut gba: agb::Gba) -> ! {
|
|||
|
||||
writer.commit();
|
||||
|
||||
bg.commit();
|
||||
bg.commit(&mut vram);
|
||||
bg.show();
|
||||
|
||||
let mut frame = 0;
|
||||
|
||||
loop {
|
||||
vblank.wait_for_vblank();
|
||||
|
||||
let mut writer = FONT.render_text((4u16, 0u16).into(), 1, 2, &mut bg, &mut vram);
|
||||
|
||||
writeln!(&mut writer, "Frame {}", frame).unwrap();
|
||||
writer.commit();
|
||||
bg.commit();
|
||||
|
||||
frame += 1;
|
||||
|
||||
vblank.wait_for_vblank();
|
||||
bg.commit(&mut vram);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ pub fn display_logo(map: &mut RegularMap, vram: &mut VRamManager) {
|
|||
}
|
||||
}
|
||||
|
||||
map.commit();
|
||||
map.commit(vram);
|
||||
map.show();
|
||||
}
|
||||
#[cfg(test)]
|
||||
|
|
|
@ -242,7 +242,7 @@ mod tests {
|
|||
|
||||
writer.commit();
|
||||
|
||||
bg.commit();
|
||||
bg.commit(&mut vram);
|
||||
bg.show();
|
||||
|
||||
crate::test_runner::assert_image_output("examples/font/font-test-output.png");
|
||||
|
|
|
@ -206,8 +206,8 @@ impl<'a> InfiniteScrolledMap<'a> {
|
|||
self.map.hide();
|
||||
}
|
||||
|
||||
pub fn commit(&mut self) {
|
||||
self.map.commit();
|
||||
pub fn commit(&mut self, vram: &mut VRamManager) {
|
||||
self.map.commit(vram);
|
||||
}
|
||||
|
||||
pub fn clear(&mut self, vram: &mut VRamManager) {
|
||||
|
|
|
@ -92,13 +92,15 @@ impl RegularMap {
|
|||
DISPLAY_CONTROL.set(new_mode);
|
||||
}
|
||||
|
||||
pub fn commit(&mut self) {
|
||||
pub fn commit(&mut self, vram: &mut VRamManager) {
|
||||
let new_bg_control_value = (self.priority as u16) | ((self.screenblock as u16) << 8);
|
||||
|
||||
self.bg_control_register().set(new_bg_control_value);
|
||||
self.bg_h_offset().set(self.x_scroll);
|
||||
self.bg_v_offset().set(self.y_scroll);
|
||||
|
||||
vram.gc();
|
||||
|
||||
if !self.tiles_dirty {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -158,6 +158,8 @@ impl DynamicTile<'_> {
|
|||
pub struct VRamManager {
|
||||
tile_set_to_vram: HashMap<TileInTileSetReference, TileReference>,
|
||||
reference_counts: Vec<TileReferenceCount>,
|
||||
|
||||
indices_to_gc: Vec<TileIndex>,
|
||||
}
|
||||
|
||||
impl VRamManager {
|
||||
|
@ -168,6 +170,7 @@ impl VRamManager {
|
|||
Self {
|
||||
tile_set_to_vram,
|
||||
reference_counts: Default::default(),
|
||||
indices_to_gc: Default::default(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -270,18 +273,26 @@ impl VRamManager {
|
|||
return;
|
||||
}
|
||||
|
||||
let tile_reference = Self::reference_from_index(tile_index);
|
||||
unsafe {
|
||||
TILE_ALLOCATOR.dealloc_no_normalise(tile_reference.0.cast().as_ptr(), TILE_LAYOUT);
|
||||
self.indices_to_gc.push(tile_index);
|
||||
}
|
||||
|
||||
pub(crate) fn gc(&mut self) {
|
||||
for tile_index in self.indices_to_gc.drain(..) {
|
||||
let index = tile_index.index() as usize;
|
||||
|
||||
let tile_reference = Self::reference_from_index(tile_index);
|
||||
unsafe {
|
||||
TILE_ALLOCATOR.dealloc_no_normalise(tile_reference.0.cast().as_ptr(), TILE_LAYOUT);
|
||||
}
|
||||
|
||||
let tile_ref = self.reference_counts[index]
|
||||
.tile_in_tile_set
|
||||
.as_ref()
|
||||
.unwrap();
|
||||
|
||||
self.tile_set_to_vram.remove(tile_ref);
|
||||
self.reference_counts[index].clear();
|
||||
}
|
||||
|
||||
let tile_ref = self.reference_counts[index]
|
||||
.tile_in_tile_set
|
||||
.as_ref()
|
||||
.unwrap();
|
||||
|
||||
self.tile_set_to_vram.remove(tile_ref);
|
||||
self.reference_counts[index].clear();
|
||||
}
|
||||
|
||||
pub fn replace_tile(
|
||||
|
|
Loading…
Add table
Reference in a new issue