Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

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

Вступ

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

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

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

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

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

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

Головна сцена містить вузол class_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, class_RichTextLabel, Власне малювання в 2D, 3D текст тощо.

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