Remove the update list and just use grid
This should improve performance on the RG351.master
parent
f60ec33b21
commit
e4c5af4acd
|
@ -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);
|
||||||
|
|
29
src/map.zig
29
src/map.zig
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue