perf: harden runtime for weaker hardware

This commit is contained in:
Rijad Zuzo
2026-08-12 10:02:45 +02:00
parent cd29da95e0
commit 34428d836a
47 changed files with 2164 additions and 243 deletions
@@ -1,8 +1,8 @@
class_name SimulationScalingBenchmark
extends RefCounted
const SCHEMA_VERSION := 1
const WORKLOAD_ID := &"full_fidelity_headless_arrival"
const SCHEMA_VERSION := 2
const WORKLOAD_ID := &"full_fidelity_combatant_headless_arrival_v2"
const RECENT_FACTS_PER_NPC := 3
const STARTING_CLOCK_TICK := 50
@@ -43,6 +43,13 @@ func prepare_manager(
npc.home_position = npc.position
manager.npcs.append(npc)
manager.wander_random_sources[npc_id] = _create_random_source(seed_value, npc_id, 1)
manager.refresh_population_index()
var no_combatants: Array[CombatantStateRecord] = []
var no_factions: Array[FactionStateRecord] = []
manager.conflict_system.restore_state_records(no_combatants, no_factions, manager.tick_count)
manager.conflict_system.register_npc_combatants(manager.npcs)
if not _get_combatant_coverage(manager)["valid"]:
return false
var pantry: StorageStateRecord = manager.get_pantry()
pantry.withdraw(SimulationIds.RESOURCE_FOOD, pantry.get_amount(SimulationIds.RESOURCE_FOOD))
@@ -63,11 +70,15 @@ func measure_manager(
or manager.npcs.size() != population
or warmup_ticks < 0
or measured_ticks <= 0
or not _get_combatant_coverage(manager)["valid"]
):
return {}
var warmup_arrivals := 0
for _tick in warmup_ticks:
warmup_arrivals += _advance_headless_tick(manager)
var warmup_coverage := _get_combatant_coverage(manager)
if not warmup_coverage["valid"] or warmup_coverage["npc_combatant_count"] != population:
return {}
var start_json: String = manager.serialize_state()
var start_event_count: int = manager.economic_events.size()
@@ -89,8 +100,12 @@ func measure_manager(
var start_state_bytes := start_json.to_utf8_buffer().size()
var end_state_bytes := end_json.to_utf8_buffer().size()
var ticks_per_second := float(measured_ticks) * 1000000.0 / float(elapsed_usec)
var combatant_coverage := _get_combatant_coverage(manager)
if not combatant_coverage["valid"] or combatant_coverage["npc_combatant_count"] != population:
return {}
return {
"schema_version": SCHEMA_VERSION,
"simulation_state_schema_version": SimulationStateRecord.SCHEMA_VERSION,
"workload_id": String(WORKLOAD_ID),
"seed": manager.simulation_seed,
"population": population,
@@ -98,6 +113,8 @@ func measure_manager(
"warmup_ticks": warmup_ticks,
"measured_ticks": measured_ticks,
"npc_updates": population * measured_ticks,
"npc_combatant_count": combatant_coverage["npc_combatant_count"],
"npc_combatant_coverage_valid": combatant_coverage["valid"],
"warmup_arrivals": warmup_arrivals,
"arrivals_processed": measured_arrivals,
"elapsed_usec": elapsed_usec,
@@ -121,6 +138,36 @@ func measure_manager(
}
func _get_combatant_coverage(manager: Node) -> Dictionary:
var expected_npcs := {}
for npc in manager.npcs:
expected_npcs[npc.id] = npc
var covered_npc_ids := {}
var npc_combatant_count := 0
var valid: bool = expected_npcs.size() == manager.npcs.size()
for combatant in manager.conflict_system.get_all_combatants():
if combatant.get_kind() != SimulationIds.COMBATANT_KIND_NPC:
continue
npc_combatant_count += 1
var npc_id: int = combatant.get_npc_id()
var npc := expected_npcs.get(npc_id) as SimNPC
if (
npc == null
or covered_npc_ids.has(npc_id)
or combatant.get_combatant_id() != SimulationIds.npc_combatant_id(npc_id)
or combatant.get_display_name() != npc.npc_name
or not combatant.get_position().is_equal_approx(npc.position)
):
valid = false
covered_npc_ids[npc_id] = true
valid = (
valid
and npc_combatant_count == expected_npcs.size()
and covered_npc_ids.size() == expected_npcs.size()
)
return {"valid": valid, "npc_combatant_count": npc_combatant_count}
func _advance_headless_tick(manager: Node) -> int:
manager.simulate_tick()
return _complete_headless_arrivals(manager)