Пользовательские мониторы производительности

Введение

Как объясняется в документации Панель Отладчика, в 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 текст и т. д.

Этот метод можно использовать и в экспортированных проектах (режим отладки и выпуска), что позволяет создавать визуализации вне редактора.