153 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Python
		
	
	
	
"""
 | 
						|
Benchmark: Moving Entities Performance Test
 | 
						|
 | 
						|
This benchmark measures McRogueFace's performance with 50 randomly moving
 | 
						|
entities on a 100x100 grid.
 | 
						|
 | 
						|
Expected results:
 | 
						|
- Should maintain 60 FPS
 | 
						|
- Entity render time should be <3ms
 | 
						|
- Grid render time will be higher due to constant updates (no dirty flag benefit)
 | 
						|
 | 
						|
Usage:
 | 
						|
    ./build/mcrogueface --exec tests/benchmark_moving_entities.py
 | 
						|
 | 
						|
Press F3 to toggle performance overlay
 | 
						|
Press ESC to exit
 | 
						|
"""
 | 
						|
 | 
						|
import mcrfpy
 | 
						|
import sys
 | 
						|
import random
 | 
						|
 | 
						|
# Create the benchmark scene
 | 
						|
mcrfpy.createScene("benchmark")
 | 
						|
mcrfpy.setScene("benchmark")
 | 
						|
 | 
						|
# Get scene UI
 | 
						|
ui = mcrfpy.sceneUI("benchmark")
 | 
						|
 | 
						|
# Create a 100x100 grid
 | 
						|
grid = mcrfpy.Grid(
 | 
						|
    grid_size=(100, 100),
 | 
						|
    pos=(0, 0),
 | 
						|
    size=(1024, 768)
 | 
						|
)
 | 
						|
 | 
						|
# Simple floor pattern
 | 
						|
for x in range(100):
 | 
						|
    for y in range(100):
 | 
						|
        cell = grid.at((x, y))
 | 
						|
        cell.tilesprite = 0
 | 
						|
        cell.color = (40, 40, 40, 255)
 | 
						|
 | 
						|
# Create 50 entities with random positions and velocities
 | 
						|
entities = []
 | 
						|
ENTITY_COUNT = 50
 | 
						|
 | 
						|
for i in range(ENTITY_COUNT):
 | 
						|
    entity = mcrfpy.Entity(
 | 
						|
        grid_pos=(random.randint(0, 99), random.randint(0, 99)),
 | 
						|
        sprite_index=random.randint(10, 20)  # Use varied sprites
 | 
						|
    )
 | 
						|
 | 
						|
    # Give each entity a random velocity
 | 
						|
    entity.velocity_x = random.uniform(-0.5, 0.5)
 | 
						|
    entity.velocity_y = random.uniform(-0.5, 0.5)
 | 
						|
 | 
						|
    grid.entities.append(entity)
 | 
						|
    entities.append(entity)
 | 
						|
 | 
						|
ui.append(grid)
 | 
						|
 | 
						|
# Instructions caption
 | 
						|
instructions = mcrfpy.Caption(
 | 
						|
    text=f"Moving Entities Benchmark ({ENTITY_COUNT} entities)\n"
 | 
						|
         "Press F3 for performance overlay\n"
 | 
						|
         "Press ESC to exit\n"
 | 
						|
         "Goal: 60 FPS with entities moving",
 | 
						|
    pos=(10, 10),
 | 
						|
    fill_color=(255, 255, 0, 255)
 | 
						|
)
 | 
						|
ui.append(instructions)
 | 
						|
 | 
						|
# Benchmark info
 | 
						|
print("=" * 60)
 | 
						|
print("MOVING ENTITIES BENCHMARK")
 | 
						|
print("=" * 60)
 | 
						|
print(f"Entity count: {ENTITY_COUNT}")
 | 
						|
print("Grid size: 100x100 cells")
 | 
						|
print("Expected FPS: 60")
 | 
						|
print("")
 | 
						|
print("Entities move randomly and bounce off walls.")
 | 
						|
print("This tests entity rendering performance and position updates.")
 | 
						|
print("")
 | 
						|
print("Press F3 in-game to see real-time performance metrics.")
 | 
						|
print("=" * 60)
 | 
						|
 | 
						|
# Exit handler
 | 
						|
def handle_key(key, state):
 | 
						|
    if key == "Escape" and state:
 | 
						|
        print("\nBenchmark ended by user")
 | 
						|
        sys.exit(0)
 | 
						|
 | 
						|
mcrfpy.keypressScene(handle_key)
 | 
						|
 | 
						|
# Update entity positions
 | 
						|
def update_entities(ms):
 | 
						|
    dt = ms / 1000.0  # Convert to seconds
 | 
						|
 | 
						|
    for entity in entities:
 | 
						|
        # Update position
 | 
						|
        new_x = entity.x + entity.velocity_x
 | 
						|
        new_y = entity.y + entity.velocity_y
 | 
						|
 | 
						|
        # Bounce off walls
 | 
						|
        if new_x < 0 or new_x >= 100:
 | 
						|
            entity.velocity_x = -entity.velocity_x
 | 
						|
            new_x = max(0, min(99, new_x))
 | 
						|
 | 
						|
        if new_y < 0 or new_y >= 100:
 | 
						|
            entity.velocity_y = -entity.velocity_y
 | 
						|
            new_y = max(0, min(99, new_y))
 | 
						|
 | 
						|
        # Update entity position
 | 
						|
        entity.x = new_x
 | 
						|
        entity.y = new_y
 | 
						|
 | 
						|
# Run movement update every frame (16ms)
 | 
						|
mcrfpy.setTimer("movement", update_entities, 16)
 | 
						|
 | 
						|
# Benchmark statistics
 | 
						|
frame_count = 0
 | 
						|
start_time = None
 | 
						|
 | 
						|
def benchmark_timer(ms):
 | 
						|
    global frame_count, start_time
 | 
						|
 | 
						|
    if start_time is None:
 | 
						|
        import time
 | 
						|
        start_time = time.time()
 | 
						|
 | 
						|
    frame_count += 1
 | 
						|
 | 
						|
    # After 10 seconds, print summary
 | 
						|
    import time
 | 
						|
    elapsed = time.time() - start_time
 | 
						|
 | 
						|
    if elapsed >= 10.0:
 | 
						|
        print("\n" + "=" * 60)
 | 
						|
        print("BENCHMARK COMPLETE")
 | 
						|
        print("=" * 60)
 | 
						|
        print(f"Frames rendered: {frame_count}")
 | 
						|
        print(f"Time elapsed: {elapsed:.2f}s")
 | 
						|
        print(f"Average FPS: {frame_count / elapsed:.1f}")
 | 
						|
        print(f"Entities: {ENTITY_COUNT}")
 | 
						|
        print("")
 | 
						|
        print("Check profiler overlay (F3) for detailed timing breakdown.")
 | 
						|
        print("Entity render time and total frame time are key metrics.")
 | 
						|
        print("=" * 60)
 | 
						|
        # Don't exit - let user review
 | 
						|
 | 
						|
mcrfpy.setTimer("benchmark", benchmark_timer, 100)
 |