124 lines
3.4 KiB
GDScript
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)
|