mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-24 08:41:34 +11:00
Try using a vec of vecs rather than a hashmap
This commit is contained in:
parent
ceb17a0186
commit
aa7823232b
|
@ -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;
|
||||||
|
use alloc::vec::Vec;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
display::palette16,
|
display::palette16,
|
||||||
|
@ -49,6 +44,10 @@ impl<'a> TileSet<'a> {
|
||||||
pub fn new(tiles: &'a [u32], format: TileFormat) -> Self {
|
pub fn new(tiles: &'a [u32], format: TileFormat) -> Self {
|
||||||
Self { tiles, format }
|
Self { tiles, format }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn num_tiles(&self) -> usize {
|
||||||
|
self.tiles.len() / self.format.tile_size() * 4
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||||
|
@ -114,7 +113,7 @@ pub struct VRamManager<'a> {
|
||||||
generation: u16,
|
generation: u16,
|
||||||
free_pointer: Option<usize>,
|
free_pointer: Option<usize>,
|
||||||
|
|
||||||
tile_set_to_vram: HashMap<TileReference, (u16, u16), BuildHasherDefault<FxHasher>>,
|
tile_set_to_vram: Vec<Vec<(u16, u16)>>,
|
||||||
references: Vec<VRamState>,
|
references: Vec<VRamState>,
|
||||||
vram_free_pointer: Option<usize>,
|
vram_free_pointer: Option<usize>,
|
||||||
}
|
}
|
||||||
|
@ -128,7 +127,7 @@ impl<'a> VRamManager<'a> {
|
||||||
generation: 0,
|
generation: 0,
|
||||||
free_pointer: None,
|
free_pointer: None,
|
||||||
|
|
||||||
tile_set_to_vram: HashMap::default(),
|
tile_set_to_vram: Default::default(),
|
||||||
references: vec![VRamState::Free(0)],
|
references: vec![VRamState::Free(0)],
|
||||||
vram_free_pointer: None,
|
vram_free_pointer: None,
|
||||||
}
|
}
|
||||||
|
@ -138,6 +137,7 @@ impl<'a> VRamManager<'a> {
|
||||||
let generation = self.generation;
|
let generation = self.generation;
|
||||||
self.generation = self.generation.wrapping_add(1);
|
self.generation = self.generation.wrapping_add(1);
|
||||||
|
|
||||||
|
let num_tiles = tileset.num_tiles();
|
||||||
let tileset = ArenaStorageItem::Data(tileset, generation);
|
let tileset = ArenaStorageItem::Data(tileset, generation);
|
||||||
|
|
||||||
let index = if let Some(ptr) = self.free_pointer.take() {
|
let index = if let Some(ptr) = self.free_pointer.take() {
|
||||||
|
@ -158,6 +158,10 @@ impl<'a> VRamManager<'a> {
|
||||||
self.tilesets.len() - 1
|
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)
|
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 {
|
pub(crate) fn add_tile(&mut self, tile_set_ref: TileSetReference, tile: u16) -> TileIndex {
|
||||||
let tile_ref = TileReference(tile_set_ref.id, tile);
|
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 {
|
if reference.1 == tile_set_ref.generation {
|
||||||
self.references[reference.0 as usize].increase_reference();
|
self.references[reference.0 as usize].increase_reference();
|
||||||
return TileIndex(reference.0 as u16);
|
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(
|
self.tile_set_to_vram[tile_set_ref.id as usize][tile as usize] =
|
||||||
TileReference(tile_set_ref.id, tile),
|
(index_to_copy_into as u16, tile_set_ref.generation);
|
||||||
(index_to_copy_into as u16, tile_set_ref.generation),
|
|
||||||
);
|
|
||||||
|
|
||||||
TileIndex(index_to_copy_into as u16)
|
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.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);
|
self.vram_free_pointer = Some(index);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue