Remove the update list and just use grid

This should improve performance on the RG351.
master
LeRoyce Pearson 2022-01-23 14:19:29 -07:00
parent f60ec33b21
commit e4c5af4acd
2 changed files with 14 additions and 20 deletions

View File

@ -172,6 +172,7 @@ var camera = Vec2{ 0, 0 };
const Coin = struct { pos: Pos, sprite: Sprite, anim: Anim, area: AABB }; const Coin = struct { pos: Pos, sprite: Sprite, anim: Anim, area: AABB };
var coins = std.BoundedArray(Coin, 10).init(0) catch unreachable; var coins = std.BoundedArray(Coin, 10).init(0) catch unreachable;
var score: u8 = 0; var score: u8 = 0;
var solids_mutable = assets.solid;
const anim_store = struct { const anim_store = struct {
const stand = Anim.frame(8); const stand = Anim.frame(8);
@ -203,7 +204,7 @@ export fn start() void {
particles = ParticleSystem.init(); particles = ParticleSystem.init();
circuit = Circuit.init(&assets.conduit, assets.conduit_size); circuit = Circuit.init(&assets.conduit, assets.conduit_size);
map = Map.init(&assets.solid, assets.solid_size); map = Map.init(&solids_mutable, assets.solid_size);
camera = @divTrunc(assets.spawn, @splat(2, @as(i32, 20))) * @splat(2, @as(i32, 20)); camera = @divTrunc(assets.spawn, @splat(2, @as(i32, 20))) * @splat(2, @as(i32, 20));
@ -489,7 +490,7 @@ fn updateCircuit() void {
const cellEnd = util.world2cell(end.pos); const cellEnd = util.world2cell(end.pos);
if (circuit.isEnabled(cellBegin) or circuit.isEnabled(cellEnd)) wire.enabled = true; if (circuit.isEnabled(cellBegin) or circuit.isEnabled(cellEnd)) wire.enabled = true;
} }
map.reset(); map.reset(&assets.solid);
const enabledDoors = circuit.enabledDoors(); const enabledDoors = circuit.enabledDoors();
for (enabledDoors.constSlice()) |door| { for (enabledDoors.constSlice()) |door| {
map.set_cell(door, 0); map.set_cell(door, 0);

View File

@ -19,33 +19,31 @@ const tilemap_width = 16;
const tilemap_height = 16; const tilemap_height = 16;
const tilemap_stride = 128; const tilemap_stride = 128;
const UpdateMap = util.Map(Cell, u8, MAXCELLS); tiles: []u8,
tiles: []const u8,
tile_updates: UpdateMap,
map_size: Vec2, map_size: Vec2,
pub fn init(map: []const u8, map_size: Vec2) @This() { pub fn init(map: []u8, map_size: Vec2) @This() {
var this = @This(){ var this = @This(){
.tiles = map, .tiles = map,
.tile_updates = UpdateMap.init(),
.map_size = map_size, .map_size = map_size,
}; };
return this; return this;
} }
pub fn set_cell(this: *@This(), cell: Cell, tile: u8) void { pub fn set_cell(this: *@This(), cell: Cell, tile: u8) void {
this.tile_updates.set(cell, tile); const x = cell[0];
const y = cell[1];
if (x < 0 or x > this.map_size[0] or y < 0 or y > this.map_size[1]) unreachable;
const i = x + y * this.map_size[0];
this.tiles[@intCast(usize, i)] = tile;
} }
pub fn reset(this: *@This()) void { pub fn reset(this: *@This(), initialState: []const u8) void {
var updates = this.tile_updates.values.slice(); std.debug.assert(initialState.len == this.tiles.len);
for (this.tile_updates.keys.slice()) |key, i| { std.mem.copy(u8, this.tiles, initialState);
updates[i] = this.get_cell_raw(key).?;
}
} }
fn get_cell_raw(this: @This(), cell: Cell) ?u8 { pub fn get_cell(this: @This(), cell: Cell) ?u8 {
const x = cell[0]; const x = cell[0];
const y = cell[1]; const y = cell[1];
if (x < 0 or x > this.map_size[0] or y < 0 or y > this.map_size[1]) return null; if (x < 0 or x > this.map_size[0] or y < 0 or y > this.map_size[1]) return null;
@ -53,11 +51,6 @@ fn get_cell_raw(this: @This(), cell: Cell) ?u8 {
return this.tiles[@intCast(u32, i)]; return this.tiles[@intCast(u32, i)];
} }
pub fn get_cell(this: @This(), cell: Cell) ?u8 {
if (this.tile_updates.get_const(cell)) |tile| return tile;
return this.get_cell_raw(cell);
}
pub fn draw(this: @This(), offset: Vec2) void { pub fn draw(this: @This(), offset: Vec2) void {
w4.DRAW_COLORS.* = 0x0210; w4.DRAW_COLORS.* = 0x0210;
var y: usize = 0; var y: usize = 0;