update tests: new scene API
This commit is contained in:
parent
f62362032e
commit
838da4571d
142 changed files with 616 additions and 601 deletions
|
|
@ -21,11 +21,11 @@ import sys
|
|||
import random
|
||||
|
||||
# Create the benchmark scene
|
||||
mcrfpy.createScene("benchmark")
|
||||
mcrfpy.setScene("benchmark")
|
||||
benchmark = mcrfpy.Scene("benchmark")
|
||||
benchmark.activate()
|
||||
|
||||
# Get scene UI
|
||||
ui = mcrfpy.sceneUI("benchmark")
|
||||
ui = benchmark.children
|
||||
|
||||
# Create a 100x100 grid
|
||||
grid = mcrfpy.Grid(
|
||||
|
|
@ -94,7 +94,7 @@ def handle_key(key, state):
|
|||
print("\nBenchmark ended by user")
|
||||
sys.exit(0)
|
||||
|
||||
mcrfpy.keypressScene(handle_key)
|
||||
benchmark.on_key = handle_key
|
||||
|
||||
# Update entity positions
|
||||
def update_entities(ms):
|
||||
|
|
|
|||
|
|
@ -158,14 +158,14 @@ def run_next_scenario():
|
|||
|
||||
def setup_empty_scene():
|
||||
"""Scenario 1: Empty scene - pure engine overhead."""
|
||||
mcrfpy.createScene("bench_empty")
|
||||
mcrfpy.setScene("bench_empty")
|
||||
bench_empty = mcrfpy.Scene("bench_empty")
|
||||
bench_empty.activate()
|
||||
|
||||
|
||||
def setup_static_100():
|
||||
"""Scenario 2: 100 static frames - best case for caching."""
|
||||
mcrfpy.createScene("bench_static")
|
||||
ui = mcrfpy.sceneUI("bench_static")
|
||||
bench_static = mcrfpy.Scene("bench_static")
|
||||
ui = bench_static.children
|
||||
|
||||
# Create 100 frames in a 10x10 grid
|
||||
for i in range(100):
|
||||
|
|
@ -183,13 +183,13 @@ def setup_static_100():
|
|||
|
||||
ui.append(frame)
|
||||
|
||||
mcrfpy.setScene("bench_static")
|
||||
bench_static.activate()
|
||||
|
||||
|
||||
def setup_animated_100():
|
||||
"""Scenario 3: 100 frames all animating - worst case for caching."""
|
||||
mcrfpy.createScene("bench_animated")
|
||||
ui = mcrfpy.sceneUI("bench_animated")
|
||||
bench_animated = mcrfpy.Scene("bench_animated")
|
||||
ui = bench_animated.children
|
||||
|
||||
frames = []
|
||||
for i in range(100):
|
||||
|
|
@ -200,7 +200,7 @@ def setup_animated_100():
|
|||
frames.append(frame)
|
||||
ui.append(frame)
|
||||
|
||||
mcrfpy.setScene("bench_animated")
|
||||
bench_animated.activate()
|
||||
|
||||
# Start animations on all frames (color animation = content change)
|
||||
for i, frame in enumerate(frames):
|
||||
|
|
@ -212,8 +212,8 @@ def setup_animated_100():
|
|||
|
||||
def setup_mixed_100():
|
||||
"""Scenario 4: 100 frames, only 10 animating - realistic case."""
|
||||
mcrfpy.createScene("bench_mixed")
|
||||
ui = mcrfpy.sceneUI("bench_mixed")
|
||||
bench_mixed = mcrfpy.Scene("bench_mixed")
|
||||
ui = bench_mixed.children
|
||||
|
||||
frames = []
|
||||
for i in range(100):
|
||||
|
|
@ -224,7 +224,7 @@ def setup_mixed_100():
|
|||
frames.append(frame)
|
||||
ui.append(frame)
|
||||
|
||||
mcrfpy.setScene("bench_mixed")
|
||||
bench_mixed.activate()
|
||||
|
||||
# Animate only 10 frames (every 10th)
|
||||
for i in range(0, 100, 10):
|
||||
|
|
@ -235,8 +235,8 @@ def setup_mixed_100():
|
|||
|
||||
def setup_deep_hierarchy():
|
||||
"""Scenario 5: 5 levels of nesting - test dirty flag propagation cost."""
|
||||
mcrfpy.createScene("bench_deep")
|
||||
ui = mcrfpy.sceneUI("bench_deep")
|
||||
bench_deep = mcrfpy.Scene("bench_deep")
|
||||
ui = bench_deep.children
|
||||
|
||||
# Create 10 trees, each with 5 levels of nesting
|
||||
deepest_frames = []
|
||||
|
|
@ -263,7 +263,7 @@ def setup_deep_hierarchy():
|
|||
if level == 4: # Deepest level
|
||||
deepest_frames.append(frame)
|
||||
|
||||
mcrfpy.setScene("bench_deep")
|
||||
bench_deep.activate()
|
||||
|
||||
# Animate the deepest frames - tests propagation up the hierarchy
|
||||
for frame in deepest_frames:
|
||||
|
|
@ -273,8 +273,8 @@ def setup_deep_hierarchy():
|
|||
|
||||
def setup_grid_stress():
|
||||
"""Scenario 6: Large grid with entities - known performance bottleneck."""
|
||||
mcrfpy.createScene("bench_grid")
|
||||
ui = mcrfpy.sceneUI("bench_grid")
|
||||
bench_grid = mcrfpy.Scene("bench_grid")
|
||||
ui = bench_grid.children
|
||||
|
||||
# Create a 50x50 grid (2500 cells)
|
||||
grid = mcrfpy.Grid(grid_size=(50, 50), pos=(50, 50), size=(700, 700))
|
||||
|
|
@ -303,7 +303,7 @@ def setup_grid_stress():
|
|||
except Exception as e:
|
||||
print(f" Note: Could not create entities: {e}")
|
||||
|
||||
mcrfpy.setScene("bench_grid")
|
||||
bench_grid.activate()
|
||||
|
||||
|
||||
# ============================================================================
|
||||
|
|
|
|||
|
|
@ -24,13 +24,14 @@ import random
|
|||
|
||||
# Configuration
|
||||
# Use smaller grid for denser entity distribution (more realistic visibility tests)
|
||||
GRID_SIZE = (100, 100) # 10,000 cells - entities will actually see each other
|
||||
#GRID_SIZE = (100, 100) # 10,000 cells - entities will actually see each other
|
||||
GRID_SIZE = (1250, 1250)
|
||||
|
||||
# Full suite - may timeout on large counts due to O(n²) visibility
|
||||
# ENTITY_COUNTS = [100, 500, 1000, 2500, 5000, 10000]
|
||||
|
||||
# Extended suite to validate scalability (on 100x100 grid)
|
||||
ENTITY_COUNTS = [100, 500, 1000, 2000, 5000]
|
||||
ENTITY_COUNTS = [100, 500, 1000, 5000]
|
||||
QUERY_RADIUS = 15 # Smaller radius for smaller grid
|
||||
MOVEMENT_PERCENT = 0.10 # 10% of entities move each frame
|
||||
N2N_SAMPLE_SIZE = 50 # Sample size for N×N visibility test
|
||||
|
|
@ -44,11 +45,12 @@ def setup_grid_with_entities(n_entities):
|
|||
global texture
|
||||
|
||||
scene_name = f"bench_{n_entities}"
|
||||
mcrfpy.createScene(scene_name)
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
_scene = mcrfpy.Scene(scene_name)
|
||||
ui = _scene.children
|
||||
|
||||
# Create grid - minimal rendering size since we're testing entity operations
|
||||
grid = mcrfpy.Grid(grid_size=GRID_SIZE, pos=(0, 0), size=(100, 100))
|
||||
#grid = mcrfpy.Grid(grid_size=GRID_SIZE, pos=(0, 0), size=(100, 100))
|
||||
grid = mcrfpy.Grid(grid_size=GRID_SIZE, pos=(0, 0), size=(1024, 768))
|
||||
ui.append(grid)
|
||||
|
||||
# Load texture once
|
||||
|
|
@ -66,7 +68,7 @@ def setup_grid_with_entities(n_entities):
|
|||
entity = mcrfpy.Entity((x, y), texture, 0, grid)
|
||||
grid.entities.append(entity)
|
||||
|
||||
mcrfpy.setScene(scene_name)
|
||||
mcrfpy.current_scene = scene_name
|
||||
return grid, scene_name
|
||||
|
||||
|
||||
|
|
@ -75,8 +77,8 @@ def benchmark_creation(n_entities):
|
|||
global texture
|
||||
|
||||
scene_name = "bench_create_test"
|
||||
mcrfpy.createScene(scene_name)
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
_scene = mcrfpy.Scene(scene_name)
|
||||
ui = _scene.children
|
||||
|
||||
grid = mcrfpy.Grid(grid_size=GRID_SIZE, pos=(0, 0), size=(100, 100))
|
||||
ui.append(grid)
|
||||
|
|
|
|||
|
|
@ -99,8 +99,8 @@ def run_next_test():
|
|||
|
||||
def setup_base_layer_static():
|
||||
"""ColorLayer with per-cell set() calls - static after initial fill."""
|
||||
mcrfpy.createScene("test_base_static")
|
||||
ui = mcrfpy.sceneUI("test_base_static")
|
||||
test_base_static = mcrfpy.Scene("test_base_static")
|
||||
ui = test_base_static.children
|
||||
|
||||
grid = mcrfpy.Grid(grid_size=(GRID_SIZE, GRID_SIZE),
|
||||
pos=(10, 10), size=(600, 600))
|
||||
|
|
@ -112,13 +112,13 @@ def setup_base_layer_static():
|
|||
for x in range(GRID_SIZE):
|
||||
layer.set(x, y, mcrfpy.Color((x * 2) % 256, (y * 2) % 256, 128, 255))
|
||||
|
||||
mcrfpy.setScene("test_base_static")
|
||||
test_base_static.activate()
|
||||
|
||||
|
||||
def setup_base_layer_modified():
|
||||
"""ColorLayer with single cell modified each frame - tests dirty flag."""
|
||||
mcrfpy.createScene("test_base_mod")
|
||||
ui = mcrfpy.sceneUI("test_base_mod")
|
||||
test_base_mod = mcrfpy.Scene("test_base_mod")
|
||||
ui = test_base_mod.children
|
||||
|
||||
grid = mcrfpy.Grid(grid_size=(GRID_SIZE, GRID_SIZE),
|
||||
pos=(10, 10), size=(600, 600))
|
||||
|
|
@ -136,14 +136,14 @@ def setup_base_layer_modified():
|
|||
layer.set(x, y, mcrfpy.Color(255, 0, 0, 255))
|
||||
mod_counter[0] += 1
|
||||
|
||||
mcrfpy.setScene("test_base_mod")
|
||||
test_base_mod.activate()
|
||||
mcrfpy.setTimer("modify", modify_cell, 1)
|
||||
|
||||
|
||||
def setup_color_layer_static():
|
||||
"""New ColorLayer with dirty flag caching - static after fill."""
|
||||
mcrfpy.createScene("test_color_static")
|
||||
ui = mcrfpy.sceneUI("test_color_static")
|
||||
test_color_static = mcrfpy.Scene("test_color_static")
|
||||
ui = test_color_static.children
|
||||
|
||||
grid = mcrfpy.Grid(grid_size=(GRID_SIZE, GRID_SIZE),
|
||||
pos=(10, 10), size=(600, 600))
|
||||
|
|
@ -153,13 +153,13 @@ def setup_color_layer_static():
|
|||
layer = grid.add_layer("color", z_index=-1)
|
||||
layer.fill(mcrfpy.Color(100, 150, 200, 128))
|
||||
|
||||
mcrfpy.setScene("test_color_static")
|
||||
test_color_static.activate()
|
||||
|
||||
|
||||
def setup_color_layer_modified():
|
||||
"""ColorLayer with single cell modified each frame - tests dirty flag."""
|
||||
mcrfpy.createScene("test_color_mod")
|
||||
ui = mcrfpy.sceneUI("test_color_mod")
|
||||
test_color_mod = mcrfpy.Scene("test_color_mod")
|
||||
ui = test_color_mod.children
|
||||
|
||||
grid = mcrfpy.Grid(grid_size=(GRID_SIZE, GRID_SIZE),
|
||||
pos=(10, 10), size=(600, 600))
|
||||
|
|
@ -176,14 +176,14 @@ def setup_color_layer_modified():
|
|||
layer.set(x, y, mcrfpy.Color(255, 0, 0, 255))
|
||||
mod_counter[0] += 1
|
||||
|
||||
mcrfpy.setScene("test_color_mod")
|
||||
test_color_mod.activate()
|
||||
mcrfpy.setTimer("modify", modify_cell, 1)
|
||||
|
||||
|
||||
def setup_tile_layer_static():
|
||||
"""TileLayer with caching - static after fill."""
|
||||
mcrfpy.createScene("test_tile_static")
|
||||
ui = mcrfpy.sceneUI("test_tile_static")
|
||||
test_tile_static = mcrfpy.Scene("test_tile_static")
|
||||
ui = test_tile_static.children
|
||||
|
||||
try:
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
|
|
@ -198,13 +198,13 @@ def setup_tile_layer_static():
|
|||
layer = grid.add_layer("tile", z_index=-1, texture=texture)
|
||||
layer.fill(5)
|
||||
|
||||
mcrfpy.setScene("test_tile_static")
|
||||
test_tile_static.activate()
|
||||
|
||||
|
||||
def setup_tile_layer_modified():
|
||||
"""TileLayer with single cell modified each frame."""
|
||||
mcrfpy.createScene("test_tile_mod")
|
||||
ui = mcrfpy.sceneUI("test_tile_mod")
|
||||
test_tile_mod = mcrfpy.Scene("test_tile_mod")
|
||||
ui = test_tile_mod.children
|
||||
|
||||
try:
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
|
|
@ -229,14 +229,14 @@ def setup_tile_layer_modified():
|
|||
layer.set(x, y, (mod_counter[0] % 20))
|
||||
mod_counter[0] += 1
|
||||
|
||||
mcrfpy.setScene("test_tile_mod")
|
||||
test_tile_mod.activate()
|
||||
mcrfpy.setTimer("modify", modify_cell, 1)
|
||||
|
||||
|
||||
def setup_multi_layer_static():
|
||||
"""Multiple layers (5 color, 5 tile) - all static."""
|
||||
mcrfpy.createScene("test_multi_static")
|
||||
ui = mcrfpy.sceneUI("test_multi_static")
|
||||
test_multi_static = mcrfpy.Scene("test_multi_static")
|
||||
ui = test_multi_static.children
|
||||
|
||||
try:
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
|
|
@ -259,13 +259,13 @@ def setup_multi_layer_static():
|
|||
layer.fill(i * 4)
|
||||
|
||||
print(f" Created {len(grid.layers)} layers")
|
||||
mcrfpy.setScene("test_multi_static")
|
||||
test_multi_static.activate()
|
||||
|
||||
|
||||
def setup_base_vs_layer_comparison():
|
||||
"""Direct comparison: same visual using base API vs layer API."""
|
||||
mcrfpy.createScene("test_comparison")
|
||||
ui = mcrfpy.sceneUI("test_comparison")
|
||||
test_comparison = mcrfpy.Scene("test_comparison")
|
||||
ui = test_comparison.children
|
||||
|
||||
# Grid using ONLY the new layer system (no base layer colors)
|
||||
grid = mcrfpy.Grid(grid_size=(GRID_SIZE, GRID_SIZE),
|
||||
|
|
@ -280,7 +280,7 @@ def setup_base_vs_layer_comparison():
|
|||
for x in range(GRID_SIZE):
|
||||
layer.set(x, y, mcrfpy.Color((x * 2) % 256, (y * 2) % 256, 128, 255))
|
||||
|
||||
mcrfpy.setScene("test_comparison")
|
||||
test_comparison.activate()
|
||||
|
||||
|
||||
# ============================================================================
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ class StressTestRunner:
|
|||
|
||||
# Setup scene
|
||||
scene_name = f"stress_{self.current_test}"
|
||||
mcrfpy.createScene(scene_name)
|
||||
_scene = mcrfpy.Scene(scene_name)
|
||||
|
||||
# Start benchmark
|
||||
mcrfpy.start_benchmark()
|
||||
|
|
@ -67,7 +67,7 @@ class StressTestRunner:
|
|||
except Exception as e:
|
||||
print(f" SETUP ERROR: {e}")
|
||||
|
||||
mcrfpy.setScene(scene_name)
|
||||
mcrfpy.current_scene = scene_name
|
||||
self.frames_counted = 0
|
||||
|
||||
def end_current_test(self):
|
||||
|
|
@ -133,10 +133,10 @@ class StressTestRunner:
|
|||
print("="*50)
|
||||
print(f"Tests: {len(self.tests)}, Duration: {TEST_DURATION_MS}ms each")
|
||||
|
||||
mcrfpy.createScene("init")
|
||||
ui = mcrfpy.sceneUI("init")
|
||||
init = mcrfpy.Scene("init")
|
||||
ui = init.children
|
||||
ui.append(mcrfpy.Frame(pos=(0,0), size=(10,10))) # Required for timer to fire
|
||||
mcrfpy.setScene("init")
|
||||
init.activate()
|
||||
mcrfpy.setTimer("tick", self.tick, TIMER_INTERVAL_MS)
|
||||
|
||||
|
||||
|
|
@ -146,7 +146,7 @@ class StressTestRunner:
|
|||
|
||||
def test_many_frames(scene_name):
|
||||
"""1000 Frame elements"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
for i in range(1000):
|
||||
frame = mcrfpy.Frame(
|
||||
pos=((i % 32) * 32, (i // 32) * 24),
|
||||
|
|
@ -158,7 +158,7 @@ def test_many_frames(scene_name):
|
|||
|
||||
def test_many_sprites(scene_name):
|
||||
"""500 Sprite elements"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
for i in range(500):
|
||||
sprite = mcrfpy.Sprite(
|
||||
|
|
@ -173,7 +173,7 @@ def test_many_sprites(scene_name):
|
|||
|
||||
def test_many_captions(scene_name):
|
||||
"""500 Caption elements"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
for i in range(500):
|
||||
caption = mcrfpy.Caption(
|
||||
text=f"Text #{i}",
|
||||
|
|
@ -184,7 +184,7 @@ def test_many_captions(scene_name):
|
|||
|
||||
def test_deep_nesting(scene_name):
|
||||
"""15-level nested frames"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
current = ui
|
||||
for level in range(15):
|
||||
frame = mcrfpy.Frame(
|
||||
|
|
@ -202,7 +202,7 @@ def test_deep_nesting(scene_name):
|
|||
|
||||
def test_large_grid(scene_name):
|
||||
"""100x100 grid with 500 entities"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
grid = mcrfpy.Grid(pos=(50, 50), size=(900, 650), grid_size=(100, 100), texture=texture)
|
||||
ui.append(grid)
|
||||
|
|
@ -223,7 +223,7 @@ def test_large_grid(scene_name):
|
|||
|
||||
def test_animation_stress(scene_name):
|
||||
"""100 frames with 200 animations"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
for i in range(100):
|
||||
frame = mcrfpy.Frame(
|
||||
pos=((i % 10) * 100 + 10, (i // 10) * 70 + 10),
|
||||
|
|
@ -241,7 +241,7 @@ def test_animation_stress(scene_name):
|
|||
|
||||
def test_static_scene(scene_name):
|
||||
"""Static game scene (ideal for caching)"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
|
||||
# Background
|
||||
|
|
@ -270,7 +270,7 @@ def test_static_scene(scene_name):
|
|||
|
||||
def test_static_scene_cached(scene_name):
|
||||
"""Static game scene with cache_subtree enabled (#144)"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
|
||||
# Background with caching enabled
|
||||
|
|
@ -299,7 +299,7 @@ def test_static_scene_cached(scene_name):
|
|||
|
||||
def test_deep_nesting_cached(scene_name):
|
||||
"""15-level nested frames with cache_subtree on outer frame (#144)"""
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
|
||||
# Outer frame with caching - entire subtree cached
|
||||
outer = mcrfpy.Frame(
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ def run_test(runtime):
|
|||
print("=" * 60)
|
||||
|
||||
# Create a 1000x1000 grid
|
||||
mcrfpy.createScene("test")
|
||||
ui = mcrfpy.sceneUI("test")
|
||||
test = mcrfpy.Scene("test")
|
||||
ui = test.children
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
|
||||
print("\nCreating 1000x1000 grid...")
|
||||
|
|
@ -94,6 +94,6 @@ def run_test(runtime):
|
|||
|
||||
sys.exit(0)
|
||||
|
||||
mcrfpy.createScene("init")
|
||||
mcrfpy.setScene("init")
|
||||
init = mcrfpy.Scene("init")
|
||||
init.activate()
|
||||
mcrfpy.setTimer("test", run_test, 100)
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@ def benchmark_grid_size(grid_x, grid_y):
|
|||
|
||||
# Create scene and grid
|
||||
scene_name = f"bench_{grid_x}x{grid_y}"
|
||||
mcrfpy.createScene(scene_name)
|
||||
ui = mcrfpy.sceneUI(scene_name)
|
||||
_scene = mcrfpy.Scene(scene_name)
|
||||
ui = _scene.children # TODO: Replace _scene with correct Scene object
|
||||
|
||||
texture = mcrfpy.Texture("assets/kenney_ice.png", 16, 16)
|
||||
|
||||
|
|
@ -130,8 +130,8 @@ def main():
|
|||
sys.exit(0)
|
||||
|
||||
# Run immediately (no timer needed for this test)
|
||||
mcrfpy.createScene("init")
|
||||
mcrfpy.setScene("init")
|
||||
init = mcrfpy.Scene("init")
|
||||
init.activate()
|
||||
|
||||
# Use a timer to let the engine initialize
|
||||
def run_benchmark(runtime):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue