Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions scripts/main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -1422,11 +1422,14 @@ func render_tile(index: int) -> void:
amount_label.visible = hover_tile_index == index
progress_label.text = ""

# Reused per-frame scratch dictionaries and per-sprite caches — this runs in
# _process, so per-frame allocations (string keys, texture lookups) add up.
# GC-conscious per-frame scratch buffers (audit #292):
# - _overlay_collision_slots / _overlay_used_slots are cleared each frame and reused.
# - _overlay_sprite_cache_frame / _overlay_sprite_cache_carrying store scalar values
# directly instead of allocating a new Dictionary per stale worker each frame.
var _overlay_collision_slots: Dictionary = {}
var _overlay_used_slots: Dictionary = {}
var _overlay_sprite_cache: Dictionary = {}
var _overlay_sprite_cache_frame: Dictionary = {}
var _overlay_sprite_cache_carrying: Dictionary = {}
var _overlay_tile_size := Vector2i.ZERO

func render_worker_overlay() -> void:
Expand Down Expand Up @@ -1465,12 +1468,12 @@ func render_worker_overlay() -> void:
var frame := worker_anim_frame(worker)
var carrying := carried_resource(worker)
var texture_stale := true
if _overlay_sprite_cache.has(name):
var cached: Dictionary = _overlay_sprite_cache[name]
texture_stale = int(cached["frame"]) != frame or String(cached["carrying"]) != carrying
if _overlay_sprite_cache_frame.has(name):
texture_stale = int(_overlay_sprite_cache_frame[name]) != frame or String(_overlay_sprite_cache_carrying.get(name, "")) != carrying
if texture_stale:
sprite.texture = worker_texture(name, frame, carrying)
_overlay_sprite_cache[name] = {"frame": frame, "carrying": carrying}
_overlay_sprite_cache_frame[name] = frame
_overlay_sprite_cache_carrying[name] = carrying
var from_pos := data_to_vec(worker.get("prev_pos", worker.get("pos", vec_to_data(stockpile_pos))))
var to_pos := data_to_vec(worker.get("pos", vec_to_data(stockpile_pos)))
var from_center := tile_center(from_pos)
Expand Down