speedin-santa/Scripts/UI/FPSCounter.gd

53 lines
1.3 KiB
GDScript3
Raw Permalink Normal View History

2024-12-18 16:35:26 -05:00
class_name FPSCounter extends CanvasLayer
2024-12-31 23:31:28 -05:00
static var instance: FPSCounter
2024-12-18 16:35:26 -05:00
@export var refreshRate: float = 0.5
@export var memorySize: int = 60
@onready var label: RichTextLabel = $RichTextLabel
@onready var timer: Timer = $Timer
enum CounterState{
OFF,
SIMPLE,
ADVANCED
}
var state: CounterState = CounterState.ADVANCED
var framerates: Array[float]
var end: int = 0
2024-12-31 23:31:28 -05:00
func _enter_tree() -> void:
if (is_instance_valid(instance) && instance != null): queue_free()
else: instance = self
2024-12-18 16:35:26 -05:00
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
framerates.resize(memorySize)
timer.start()
func setState(newState: CounterState) -> void:
state = newState
if (state == CounterState.OFF): hide()
else: show()
func _on_timer_timeout() -> void:
framerates[end] = Engine.get_frames_per_second()
end += 1
if (end > memorySize - 1): end = 0
match (state):
CounterState.OFF:
return
CounterState.SIMPLE:
label.text = "FPS: %s" % Engine.get_frames_per_second()
CounterState.ADVANCED:
label.text = "FPS: %s | Average: %s | Max: %s | Min: %s" % [Engine.get_frames_per_second(), average(framerates), framerates.max(), framerates.min()]
timer.start()
func average(arr: Array[float]) -> float:
var total: float = 0
for num: float in arr:
total += num
return roundf(total / arr.size())