Files
2026-01-15 15:27:48 +01:00

124 lines
3.4 KiB
GDScript

## System Performance Tests
## Tests system processing and entity iteration performance
extends GdUnitTestSuite
var runner: GdUnitSceneRunner
var world: World
func before():
runner = scene_runner("res://addons/gecs/tests/test_scene.tscn")
world = runner.get_property("world")
ECS.world = world
func after_test():
if world:
world.purge(false)
## Setup entities for system testing
func setup_entities_for_systems(count: int) -> void:
for i in count:
var entity = Entity.new()
entity.name = "SystemEntity_%d" % i
entity.add_component(C_TestA.new())
if i % 2 == 0:
entity.add_component(C_TestB.new())
if i % 4 == 0:
entity.add_component(C_TestC.new())
world.add_entity(entity, null, false)
## Test simple system processing
func test_system_processing(scale: int, test_parameters := [[100], [1000], [10000]]):
setup_entities_for_systems(scale)
var test_system = PerformanceTestSystem.new()
world.add_system(test_system)
var time_ms = PerfHelpers.time_it(func():
world.process(0.016) # 60 FPS delta
)
PerfHelpers.record_result("system_processing", scale, time_ms)
world.purge(false)
## Test multiple systems processing
func test_multiple_systems(scale: int, test_parameters := [[100], [1000], [10000]]):
setup_entities_for_systems(scale)
var system_a = PerformanceTestSystem.new()
var system_b = ComplexPerformanceTestSystem.new()
world.add_systems([system_a, system_b])
var time_ms = PerfHelpers.time_it(func():
world.process(0.016)
)
PerfHelpers.record_result("multiple_systems", scale, time_ms)
world.purge(false)
## Test system processing with no matches
func test_system_no_matches(scale: int, test_parameters := [[100], [1000], [10000]]):
setup_entities_for_systems(scale)
# Create system that won't match any entities
var test_system = PerformanceTestSystem.new()
world.add_system(test_system)
# Remove all C_TestA components so system doesn't match
for entity in world.entities:
entity.remove_component(C_TestA)
var time_ms = PerfHelpers.time_it(func():
world.process(0.016)
)
PerfHelpers.record_result("system_no_matches", scale, time_ms)
world.purge(false)
## Test system processing with different groups
func test_system_groups(scale: int, test_parameters := [[100], [1000], [10000]]):
setup_entities_for_systems(scale)
var physics_system = PerformanceTestSystem.new()
physics_system.group = "physics"
var render_system = PerformanceTestSystem.new()
render_system.group = "render"
world.add_systems([physics_system, render_system])
var time_ms = PerfHelpers.time_it(func():
world.process(0.016, "physics")
world.process(0.016, "render")
)
PerfHelpers.record_result("system_groups", scale, time_ms)
world.purge(false)
## Test system processing with entity changes mid-frame
func test_system_dynamic_entities(scale: int, test_parameters := [[100], [1000], [10000]]):
# Start with half the entities
setup_entities_for_systems(scale / 2)
var test_system = PerformanceTestSystem.new()
world.add_system(test_system)
var time_ms = PerfHelpers.time_it(func():
# Process
world.process(0.016)
# Add more entities mid-frame
for i in range(scale / 2, scale):
var entity = Entity.new()
entity.add_component(C_TestA.new())
world.add_entity(entity, null, false)
# Process again with more entities
world.process(0.016)
)
PerfHelpers.record_result("system_dynamic_entities", scale, time_ms)
world.purge(false)