Randoloot/tests/previews/lander_render_test.gd

60 lines
2.4 KiB
GDScript

extends Node
func _ready() -> void:
GameState.system_seed = 8428159
var game := preload("res://scenes/game/game.tscn").instantiate()
add_child(game)
await get_tree().process_frame
var manager := game.get_node("PlanetExpeditions")
for enemy in get_tree().get_nodes_in_group("enemies"):
enemy.position = Vector2(9000,9000)
game.player.position = game.protected_planet.position
game.player.landing_combat_lock = 0
manager.scan_nearby()
manager.land_nearby()
var surface: Control = manager.screen
assert(surface.lander.physics_interpolation_mode == Node.PHYSICS_INTERPOLATION_MODE_ON)
assert(surface.lander.texture_filter == CanvasItem.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS)
# Deliberately separate physics and render rates to expose stepping.
Engine.physics_ticks_per_second = 20
Engine.max_fps = 120
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
surface._motion.velocity = Vector2(160,0)
var previous_physics: Vector2 = surface.lander.position
var previous_render := previous_physics
var interpolated_frames := 0
var frame_times: Array[float] = []
var start := Time.get_ticks_usec()
var last := start
for frame in 180:
await RenderingServer.frame_post_draw
var now := Time.get_ticks_usec()
if frame > 20:
frame_times.append((now-last)/1000.0)
last = now
var pose: Vector2 = surface.camera.position
if surface.lander.position.is_equal_approx(previous_physics) and not pose.is_equal_approx(previous_render):
interpolated_frames += 1
previous_physics = surface.lander.position
previous_render = pose
assert(interpolated_frames > 20)
Engine.physics_ticks_per_second = 60
frame_times.sort()
print("LANDER RENDER PASS: interpolated intermediate frames=",interpolated_frames,
"; median frame ms=",frame_times[frame_times.size()/2],
"; p95 ms=",frame_times[int(frame_times.size()*0.95)])
surface.lander.position = Vector2.ZERO
surface._previous_position = Vector2.ZERO
surface.lander.rotation = 0
surface._motion.velocity = Vector2.ZERO
surface._motion.rotation = 0
surface.lander.reset_physics_interpolation()
surface.camera.position = Vector2.ZERO
surface.camera.reset_smoothing()
await get_tree().process_frame
await RenderingServer.frame_post_draw
get_viewport().get_texture().get_image().save_png("res://artifacts/lander_sharp_preview.png")
manager.finish_surface(true)
game.queue_free()
await get_tree().process_frame
get_tree().quit()