Add new tests and implement frame budget management
- Introduced `civilization_benchmark.gd` and `legacy_quantity_math.gd` for benchmarking and legacy quantity calculations. - Created `test_dynamic_math.gd`, `test_frame_evolution.gd`, and `test_sparse_batches.gd` to validate mathematical operations and frame evolution logic. - Implemented `frame_budget.gd` to manage cooperative work on the main thread, ensuring no partially calculated state is published. - Added UID files for all new scripts to maintain unique identifiers.
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
extends SceneTree
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
func _initialize(): call_deferred("run")
|
||||
|
||||
func run():
|
||||
for scenario in ["ordinary", "hypergiants"]:
|
||||
var world = load("res://world/owniverse/owniverse.gd").new()
|
||||
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
|
||||
for id in world.catalog.entities:
|
||||
world.state.amount[id] = 0
|
||||
world.state.stats.total_amount[id] = 0
|
||||
var group: String = world.catalog.entities[id].group_as
|
||||
if group != "":
|
||||
world.state.amount[group] = 0
|
||||
world.state.stats.total_amount[group] = 0
|
||||
world.speed = 6
|
||||
world.state.amount.S = E.of("1e24")
|
||||
world.state.amount.H = E.of("1e24")
|
||||
for entry in [["RD", 1234567], ["YD", 765432], ["STN", 654321]]:
|
||||
world.state.amount[entry[0]] = entry[1]
|
||||
world.batches.append_batch(world.state, entry[0], entry[1], 0, 0)
|
||||
if scenario == "hypergiants":
|
||||
world.state.amount.HG = E.of("1e20")
|
||||
world.batches.append_batch(world.state, "HG", E.of("1e20"), 0, 0)
|
||||
var start_year = E.subtract(world.catalog.entities.HG.lifespan, 1000)
|
||||
world.state.time = {"datetime": start_year, "year": start_year}
|
||||
var samples: Array = []
|
||||
var total: int = 0
|
||||
for frame in 600:
|
||||
var started: int = Time.get_ticks_usec()
|
||||
world.evolute(1.0 / 60.0)
|
||||
var duration: int = Time.get_ticks_usec() - started
|
||||
samples.append(duration)
|
||||
total += duration
|
||||
samples.sort()
|
||||
print("Speed 6 %s: 600 frames, mean %.3f ms, p95 %.3f ms, max %.3f ms, %.1f cycles/sec" % [scenario, total / 600000.0, samples[569] / 1000.0, samples.back() / 1000.0, 600000000.0 / total])
|
||||
for entity in world.catalog.entities.values(): entity.free()
|
||||
world.free()
|
||||
quit()
|
||||
Reference in New Issue
Block a user