Пользовательские мониторы производительности
Введение
Как объясняется в документации Панель Отладчика, в Godot есть нижняя панель Debugger > Monitors, которая позволяет отслеживать различные значения с помощью графиков, отображающих их динамику. Данные для этих графиков берутся из синглтона движка Performance.
Начиная с Godot 4.0, вы можете задавать пользовательские значения для отображения на вкладке «Monitors». Примеры использования пользовательских мониторов производительности:
Отображение показателей производительности, специфичных для вашего проекта. Например, в воксельной игре можно создать монитор производительности для отслеживания количества фрагментов, загружаемых каждую секунду.
Отображение внутриигровых показателей, которые не связаны напрямую с производительностью, но всё же полезны для построения графиков в целях отладки. Например, вы можете отслеживать количество врагов в игре, чтобы убедиться, что механика появления врагов работает правильно.
Создание собственного монитора производительности
В этом примере мы создадим специальный монитор производительности, который будет отслеживать количество врагов в текущем запущенном проекте.
Основная сцена содержит узел Timer со следующим прикрепленным скриптом:
extends Timer
func _ready():
# The slash delimiter is used to determine the category of the monitor.
# If there is no slash in the monitor name, a generic "Custom" category
# will be used instead.
Performance.add_custom_monitor("game/enemies", get_enemy_count)
timeout.connect(_on_timeout)
# Spawn 20 enemies per second.
wait_time = 0.05
start()
func _on_timeout():
var enemy = preload("res://enemy.tscn").instantiate()
get_parent().add_child(enemy)
# This function is called every time the performance monitor is queried
# (this occurs once per second in the editor, more if called manually).
# The function must return a number greater than or equal to 0 (int or float).
func get_enemy_count():
return get_tree().get_nodes_in_group("enemies").size()
Вторым параметром Performance.add_custom_monitor является Callable.
enemy.tscn — это сцена с корневым узлом Node2D и дочерним узлом Timer. К Node2D прикреплён следующий скрипт:
extends Node2D
func _ready():
add_to_group("enemies")
$Timer.timeout.connect(_on_timer_timeout)
# Despawn enemies 2.5 seconds after they spawn.
$Timer.wait_time = 2.5
$Timer.start()
func _on_timer_timeout():
queue_free()
В этом примере, поскольку мы создаем 20 врагов в секунду и каждый враг исчезает через 2,5 секунды после появления, мы ожидаем, что количество врагов, присутствующих на сцене, стабилизируется на уровне 50. Мы можем убедиться в этом, посмотрев на график.
Чтобы визуализировать график, созданный этим пользовательским монитором производительности, запустите проект, перейдите в редактор во время его работы и откройте Debugger > Monitors в нижней части окна редактора. Прокрутите вниз до нового раздела Game и отметьте Enemies. Вы увидите следующий график:
Пример графика редактора из пользовательского монитора производительности
Примечание
Код обработки данных монитора производительности не обязательно должен располагаться в том же скрипте, что и сами узлы. Вы можете перенести регистрацию и функцию получения данных монитора производительности в autoload.
Запрос к монитору производительности в проекте
Если вы хотите отобразить значение монитора производительности в окне запущенного проекта (а не в редакторе), используйте Performance.get_custom_monitor("category/name") для получения значения пользовательского монитора. Вы можете отобразить значение, используя Label, RichTextLabel, Пользовательская отрисовка в 2D, 3D текст и т. д.
Этот метод можно использовать и в экспортированных проектах (режим отладки и выпуска), что позволяет создавать визуализации вне редактора.