Capture current source, content data, tests, asset licenses, and original-specification traceability. Original implementation remains incomplete. The accepted matching UI generation passed 154 suites and 12,253 checks, with eight rendered staff-contract screens reviewed. Latest native Windows and full-original acceptance remain outstanding.
85 lines
3.3 KiB
GDScript
85 lines
3.3 KiB
GDScript
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)
|