OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scenes / test / _probe_clouds_switch_cost.gd

69 lines · gd ref:
extends SceneTree
## Probe: does the Settings clouds switch (CompositorEffect.enabled = false) remove
## SunshineClouds2's GPU cost in the real renderer? (hyper-games #93 §2)
##
## A sky, a camera and ONE SunshineCloudsGD in the WorldEnvironment's compositor.
## Measures the viewport's GPU render time over three windows: on, off (via
## Settings._apply_clouds(false)), on again. Needs a display (not --headless):
##   "$HYPER_TPS_GODOT" --path . --resolution 1280x720 --script res://scenes/test/_probe_clouds_switch_cost.gd

const WARM := 120
const WINDOW := 120

var _frame := 0
var _vp_rid: RID
var _samples := {"on": [], "off": [], "on2": []}
var _settings: Node


func _initialize() -> void:
	var env := Environment.new()
	env.background_mode = Environment.BG_SKY
	env.sky = Sky.new()
	env.sky.sky_material = ProceduralSkyMaterial.new()
	var we := WorldEnvironment.new()
	we.environment = env
	we.compositor = Compositor.new()
	var fx: Array[CompositorEffect] = [SunshineCloudsGD.new()]
	we.compositor.compositor_effects = fx
	root.add_child(we)
	var sun := DirectionalLight3D.new()
	sun.rotation_degrees = Vector3(-35, 30, 0)
	root.add_child(sun)
	var cam := Camera3D.new()
	cam.position = Vector3(0, 300, 0)
	cam.rotation_degrees = Vector3(10, 0, 0)
	cam.far = 40000
	root.add_child(cam)
	cam.make_current()
	_vp_rid = root.get_viewport_rid()
	RenderingServer.viewport_set_measure_render_time(_vp_rid, true)


func _process(_delta: float) -> bool:
	_frame += 1
	if _settings == null:
		_settings = root.get_node_or_null(^"/root/Settings")  # autoloads are not in the tree during _initialize
	var gpu := RenderingServer.viewport_get_measured_render_time_gpu(_vp_rid)
	var phase := ""
	if _frame > WARM and _frame <= WARM + WINDOW:
		phase = "on"
	elif _frame == WARM + WINDOW + 1:
		_settings._apply_clouds(false)
	elif _frame > WARM + WINDOW + 30 and _frame <= WARM + 2 * WINDOW + 30:
		phase = "off"
	elif _frame == WARM + 2 * WINDOW + 31:
		_settings._apply_clouds(true)
	elif _frame > WARM + 2 * WINDOW + 61 and _frame <= WARM + 3 * WINDOW + 61:
		phase = "on2"
	elif _frame > WARM + 3 * WINDOW + 61:
		for k in ["on", "off", "on2"]:
			var s: Array = _samples[k]
			s.sort()
			print("PROBE clouds %-4s GPU ms median %.2f p90 %.2f (n=%d)" % [k, s[s.size() / 2], s[int(s.size() * 0.9)], s.size()])
		print("PROBE adapter: %s" % RenderingServer.get_video_adapter_name())
		return true
	if phase != "":
		(_samples[phase] as Array).append(gpu)
	return false