From aa7823232b5cf46564bfb36d0e2e6661128f50d1 Mon Sep 17 00:00:00 2001 From: Gwilym Kuiper Date: Sat, 19 Feb 2022 22:06:06 +0000 Subject: [PATCH] Try using a vec of vecs rather than a hashmap --- agb/src/display/tiled/vram_manager.rs | 33 +++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/agb/src/display/tiled/vram_manager.rs b/agb/src/display/tiled/vram_manager.rs index 10f61e3..249023b 100644 --- a/agb/src/display/tiled/vram_manager.rs +++ b/agb/src/display/tiled/vram_manager.rs @@ -1,10 +1,5 @@ -use alloc::vec::Vec; - -use core::hash::BuildHasherDefault; -use hashbrown::HashMap; -use rustc_hash::FxHasher; - use alloc::vec; +use alloc::vec::Vec; use crate::{ display::palette16, @@ -49,6 +44,10 @@ impl<'a> TileSet<'a> { pub fn new(tiles: &'a [u32], format: TileFormat) -> Self { Self { tiles, format } } + + fn num_tiles(&self) -> usize { + self.tiles.len() / self.format.tile_size() * 4 + } } #[derive(Clone, Copy, PartialEq, Eq)] @@ -114,7 +113,7 @@ pub struct VRamManager<'a> { generation: u16, free_pointer: Option, - tile_set_to_vram: HashMap>, + tile_set_to_vram: Vec>, references: Vec, vram_free_pointer: Option, } @@ -128,7 +127,7 @@ impl<'a> VRamManager<'a> { generation: 0, free_pointer: None, - tile_set_to_vram: HashMap::default(), + tile_set_to_vram: Default::default(), references: vec![VRamState::Free(0)], vram_free_pointer: None, } @@ -138,6 +137,7 @@ impl<'a> VRamManager<'a> { let generation = self.generation; self.generation = self.generation.wrapping_add(1); + let num_tiles = tileset.num_tiles(); let tileset = ArenaStorageItem::Data(tileset, generation); let index = if let Some(ptr) = self.free_pointer.take() { @@ -158,6 +158,10 @@ impl<'a> VRamManager<'a> { self.tilesets.len() - 1 }; + self.tile_set_to_vram + .resize(self.tilesets.len(), Default::default()); + self.tile_set_to_vram[index] = vec![Default::default(); num_tiles]; + TileSetReference::new(index as u16, generation) } @@ -185,10 +189,13 @@ impl<'a> VRamManager<'a> { pub(crate) fn add_tile(&mut self, tile_set_ref: TileSetReference, tile: u16) -> TileIndex { let tile_ref = TileReference(tile_set_ref.id, tile); - if let Some(&reference) = self.tile_set_to_vram.get(&tile_ref) { + let reference = self.tile_set_to_vram[tile_set_ref.id as usize][tile as usize]; + if reference != Default::default() { if reference.1 == tile_set_ref.generation { self.references[reference.0 as usize].increase_reference(); return TileIndex(reference.0 as u16); + } else { + panic!("Tileset unloaded but not cleared from vram"); } } @@ -236,10 +243,8 @@ impl<'a> VRamManager<'a> { ); } - self.tile_set_to_vram.insert( - TileReference(tile_set_ref.id, tile), - (index_to_copy_into as u16, tile_set_ref.generation), - ); + self.tile_set_to_vram[tile_set_ref.id as usize][tile as usize] = + (index_to_copy_into as u16, tile_set_ref.generation); TileIndex(index_to_copy_into as u16) } @@ -259,7 +264,7 @@ impl<'a> VRamManager<'a> { self.references[index] = VRamState::Free(END_OF_FREE_LIST_MARKER); } - self.tile_set_to_vram.remove(&tile_ref); + self.tile_set_to_vram[tile_ref.0 as usize][tile_ref.1 as usize] = Default::default(); self.vram_free_pointer = Some(index); }