Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Eigene Performance-Monitore

Einführung

Wie in der Debugger-Panel-Dokumentation erläutert, verfügt Godot über ein unteres Panel Debugger > Monitore, das die Verfolgung verschiedener Werte mit Graphen ermöglicht, die ihre Entwicklung über die Zeit zeigen. Die Daten für diese Diagramme werden aus dem Singleton Performance der Engine bezogen.

Seit Godot 4.0 können Sie benutzerdefinierte Werte deklarieren, die auf dem Monitore-Tab angezeigt werden. Anwendungsbeispiele für benutzerdefinierte Performance-Monitore sind:

  • Anzeige von Performance-Metriken, die für Ihr Projekt spezifisch sind. In einem Voxel-Spiel könnten Sie zum Beispiel einen Performance-Monitor erstellen, um die Anzahl der pro Sekunde geladenen Chunks zu verfolgen.

  • Anzeige von Metriken im Spiel, die nicht unbedingt mit der Performance zu tun haben, aber dennoch nützlich sind, um sie für Debugging-Zwecke darzustellen. Sie könnten zum Beispiel die Anzahl der im Spiel vorhandenen Feinde verfolgen, um sicherzustellen, dass Ihre Spawning-Mechanik wie vorgesehen funktioniert.

Erstellen eines benutzerdefinierten Performance-Monitors

In diesem Beispiel erstellen wir einen benutzerdefinierten Performance-Monitor, um zu verfolgen, wie viele Feinde im laufenden Projekt vorhanden sind.

Die Hauptszene enthält einen Timer Node mit dem folgenden Skript:

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()

Der zweite Parameter von Performance.add_custom_monitor ist ein Callable.

Die Datei enemy.tscn ist eine Szene mit einem Node2D-Root-Node und einem Timer-Child-Node. Der Node2D hat das folgende Skript angehängt:

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()

Da wir in diesem Beispiel 20 Feinde pro Sekunde spawnen und jeder Feind 2,5 Sekunden nach dem Spawnen despawnt, erwarten wir, dass sich die Anzahl der Feinde in der Szene auf 50 einpendelt. Wir können uns davon überzeugen, indem wir uns den Graphen ansehen.

Um den von diesem benutzerdefinierten Performance-Monitor erstellten Graphen zu visualisieren, führen Sie das Projekt aus, wechseln Sie zum Editor, während das Projekt läuft, und öffnen Sie Debugger > Monitore am unteren Rand des Editorfensters. Scrollen Sie nach unten zum neu verfügbaren Abschnitt Spiel und markieren Sie Enemies. Sie sollten ein Diagramm sehen, das wie folgt aussieht:

Beispiel eines Editor-Diagramms aus einem benutzerdefinierten Performance-Monitor

Beispiel eines Editor-Diagramms aus einem benutzerdefinierten Performance-Monitor

Bemerkung

Der Code zur Handhabung des Performance-Monitors muss nicht im selben Skript wie die Nodes selbst enthalten sein. Sie können stattdessen die Performance-Monitor-Registrierung und die Getter-Funktion in einen Autoload verschieben.

Abfrage eines Performance-Monitors in einem Projekt

Wenn Sie den Wert des Performance-Monitors im Fenster des laufenden Projekts (und nicht im Editor) anzeigen möchten, verwenden Sie Performance.get_custom_monitor("category/name"), um den Wert des benutzerdefinierten Monitors zu holen. Sie können den Wert mit Label, RichTextLabel, Manuelles Zeichnen in 2D, 3D-Text, etc. anzeigen.

Diese Methode kann auch in exportierten Projekten verwendet werden (Debug- und Freigabemodus), wodurch Sie Visualisierungen außerhalb des Editors erstellen können.