Пользовательские мониторы производительности
Введение
Как объясняется в документации Панель Отладчика, в Godot есть нижняя панель Debugger > Monitors, которая позволяет отслеживать различные значения с помощью графиков, отображающих их динамику. Данные для этих графиков берутся из синглтона движка Performance.
Godot lets you declare custom values to be displayed in the Monitors tab. Example use cases for custom performance monitors include:
Отображение показателей производительности, специфичных для вашего проекта. Например, в воксельной игре можно создать монитор производительности для отслеживания количества фрагментов, загружаемых каждую секунду.
Отображение внутриигровых показателей, которые не связаны напрямую с производительностью, но всё же полезны для построения графиков в целях отладки. Например, вы можете отслеживать количество врагов в игре, чтобы убедиться, что механика появления врагов работает правильно.
Создание собственного монитора производительности
В этом примере мы создадим специальный монитор производительности, который будет отслеживать количество врагов в текущем запущенном проекте.
Основная сцена содержит узел 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 текст и т. д.
Этот метод можно использовать и в экспортированных проектах (режим отладки и выпуска), что позволяет создавать визуализации вне редактора.