basic ECS spawner
This commit is contained in:
123
addons/gecs/tests/performance/test_system_perf.gd
Normal file
123
addons/gecs/tests/performance/test_system_perf.gd
Normal file
@@ -0,0 +1,123 @@
|
||||
## 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)
|
||||
Reference in New Issue
Block a user