Спеціальні монітори продуктивності

Вступ

Як пояснюється в документації Панель налагоджувача, Godot має нижню панель Debugger > Monitors, яка дозволяє відстежувати різні значення за допомогою графіків, що показують їх зміну з часом. Дані для цих графіків отримано з синглтона Performance двигуна.

Починаючи з Godot 4.0, ви можете оголошувати власні значення для відображення на вкладці «Монітори». Приклади використання спеціальних моніторів продуктивності включають:

  • Відображення показників ефективності, які стосуються вашого проекту. Наприклад, у воксельній грі ви можете створити монітор продуктивності для відстеження кількості фрагментів, які завантажуються щосекунди.

  • Відображення внутрішньоігрових показників, які не пов’язані виключно з продуктивністю, але все ж корисні для побудови графіків для налагодження. Наприклад, ви можете відстежувати кількість ворогів, присутніх у грі, щоб переконатися, що ваша механіка нересту працює належним чином.

Створення спеціального монітора продуктивності

У цьому прикладі ми створимо спеціальний монітор продуктивності, щоб відстежувати кількість ворогів у поточному проекті.

Головна сцена містить вузол 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. Ми можемо переконатися в цьому, подивившись на графік.

Щоб візуалізувати графік, створений за допомогою цього спеціального монітора продуктивності, запустіть проект, перейдіть до редактора під час виконання проекту та відкрийте Налагоджувач > Монітори внизу вікна редактора. Прокрутіть униз до нещодавно доступного розділу Гра та позначте Вороги. Ви повинні побачити наступний графік:

Приклад графіка редактора з настроюваного монітора продуктивності

Приклад графіка редактора з настроюваного монітора продуктивності

Примітка

Код обробки монітора продуктивності не обов’язково повинен міститись у тому ж сценарії, що й самі вузли. Натомість ви можете перемістити реєстрацію монітора продуктивності та функцію отримання до autoload.

Запит до монітора продуктивності в проекті

Якщо ви хочете відобразити значення монітора продуктивності у вікні запущеного проекту (а не в редакторі), використовуйте Performance.get_custom_monitor("category/name"), щоб отримати значення користувацького монітора. Ви можете відобразити значення за допомогою Label, RichTextLabel, Власне малювання в 2D, 3D текст тощо.

Цей метод також можна використовувати в експортованих проектах (режим налагодження та випуску), що дозволяє створювати візуалізації поза редактором.