perf: harden runtime for weaker hardware
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user