Up to date

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

Laden im Hintergrund

In der Regel müssen Spiele Ressourcen asynchron laden. Wenn Sie die Hauptszene Ihres Spiels wechseln (z.B. zu einem neuen Level), möchten Sie vielleicht einen Ladebildschirm mit einem Hinweis darauf anzeigen, dass etwas passiert, oder Sie möchten zusätzliche Ressourcen während des Spiels laden.

Die Standard-Lademethode (ResourceLoader.load oder die einfachere GDScript-Methode load) blockiert Ihren Thread, so dass Ihr Spiel nicht mehr reagiert, während die Ressource geladen wird.

Eine Möglichkeit, dies zu umgehen, ist die Verwendung von ResourceLoader zum asynchronen Laden von Ressourcen in Hintergrund-Threads.

Verwendung von ResourceLoader

Im Allgemeinen stellt man Anfragen zum Laden von Ressourcen für einen Pfad mit ResourceLoader.load_threaded_request in eine Warteschlange, die dann in Threads im Hintergrund geladen werden.

Sie können den Status mit ResourceLoader.load_threaded_get_status überprüfen. Der Fortschritt kann durch die Übergabe einer Array-Variable über progress erhalten werden, die ein Ein-Element-Array zurückgibt, das den Prozentsatz enthält.

Schließlich können Sie geladene Ressourcen durch den Aufruf von ResourceLoader.load_threaded_get abrufen.

Nach dem Aufruf von load_threaded_get() wird entweder die Ressource im Hintergrund fertig geladen und sofort zurückgegeben oder der Ladevorgang wird an dieser Stelle blockiert, wie es bei load() der Fall wäre. Wenn Sie sicherstellen wollen, dass der Vorgang nicht blockiert, müssen Sie entweder sicherstellen, dass zwischen der Anforderung des Ladevorgangs und dem Abrufen der Ressource genügend Zeit vergeht, oder Sie müssen den Status manuell überprüfen.

Beispiel

Dieses Beispiel zeigt, wie man eine Szene im Hintergrund lädt. Wir werden einen Button haben, der einen Gegner spawnen lässt, wenn er gedrückt wird. Der Gegner wird Enemy.tscn sein, den wir bei _ready laden und beim Drücken instanziieren. Der Pfad wird "Enemy.tscn" sein, der unter res://Enemy.tscn zu finden ist.

Zunächst wird eine Anfrage gestartet, um die Ressource zu laden und den Button zu verbinden:

const ENEMY_SCENE_PATH : String = "Enemy.tscn"

func _ready():
    ResourceLoader.load_threaded_request(ENEMY_SCENE_PATH)
    self.pressed.connect(_on_button_pressed)

Jetzt wird _on_button_pressed aufgerufen, wenn der Button gedrückt wird. Diese Methode wird benutzt, um einen Gegner zu spawnen.

func _on_button_pressed(): # Button was pressed
    # Obtain the resource now that we need it
    var enemy_scene = ResourceLoader.load_threaded_get(ENEMY_SCENE_PATH)
    # Instantiate the enemy scene and add it to the current scene
    var enemy = enemy_scene.instantiate()
    add_child(enemy)