extends SceneTree const Linear := preload("res://tests/performance/fixtures/linear_path_reference.gd") const Uncached := preload("res://tests/performance/fixtures/uncached_preview_reference.gd") var failures := 0 var checks := 0 func _initialize() -> void: call_deferred("_run") func expect(value: bool, label: String) -> void: checks += 1 if not value: failures += 1 push_error(label) func _run() -> void: var fast := PathService.new() var old := Linear.new() var cells: Array[Vector3i] = [] for z in 2: for x in 30: for y in 20: cells.append(Vector3i(x, y, z)) for service: PathService in [fast, old]: service.rebuild_graph(cells) service.configure_connector(&"door", Vector3i(15, 10, 0), Vector3i(15, 10, 1), 100, true, &"staff") var rng := RandomNumberGenerator.new() rng.seed = 728191 var fast_us := 0 var old_us := 0 for index in 120: var cell := cells[rng.randi_range(0, cells.size() - 1)] for service: PathService in [fast, old]: service.set_cell_dynamic_cost(cell, (index % 5) * 100) service.set_cell_temporary_block(cell, index % 7 == 0) service.set_connector_enabled(&"door", index % 9 != 0) var start := cells[rng.randi_range(0, cells.size() - 1)] var goal := cells[rng.randi_range(0, cells.size() - 1)] var access: Array[StringName] = [] if index % 4 != 0: access.append(&"staff") var began := Time.get_ticks_usec() var expected := old.find_path(start, goal, null, access) old_us += Time.get_ticks_usec() - began began = Time.get_ticks_usec() var actual := fast.find_path(start, goal, null, access) fast_us += Time.get_ticks_usec() - began expect(actual == expected and fast.last_path_cost == old.last_path_cost and fast.last_no_route_reason == old.last_no_route_reason, "route, cost, reason must match linear reference: %d" % index) expect(fast.create_snapshot() == old.create_snapshot(), "query optimization must preserve snapshots") print("PATH_BENCH old_us=%d new_us=%d ratio=%.3f queries=120 cells=1200" % [old_us, fast_us, float(fast_us)/old_us]) var runtime: Variant = root.get_node("SimulationRuntime") var preview := WorldPreview.new() var reference := Uncached.new() for view: WorldPreview in [preview, reference]: view.size = Vector2(1100, 600) view.set_runtime(runtime) var timings: Array[int] = [] for view: WorldPreview in [reference, preview]: var began := Time.get_ticks_usec() for frame in 20: view._drawing = true view._draw_cache.clear() for i in 300: view.get_cell_rect(Vector3i(i % 20 - 10, i % 8, 0)) view._drawing = false view._draw_cache.clear() timings.append(Time.get_ticks_usec() - began) for zoom: float in [0.5, 1.0, 2.0, 4.0]: for view: WorldPreview in [preview, reference]: view.zoom_level = zoom view.pan_offset = Vector2(19, -33) preview._drawing = true preview._draw_cache.clear() for i in 40: expect(preview.get_cell_rect(Vector3i(i - 20, i % 7, 0)) == reference.get_cell_rect(Vector3i(i - 20, i % 7, 0)), "cached camera mapping preserves cell geometry") preview._drawing = false preview._draw_cache.clear() expect(preview._draw_cache.is_empty(), "no derived cache survives a draw scope") print("GEOMETRY_BENCH old_us=%d new_us=%d ratio=%.3f cells=6000" % [timings[0], timings[1], float(timings[1])/timings[0]]) preview.free() reference.free() print("PASS: %d checks; failures=%d" % [checks, failures]) quit(failures)