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