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.

Carregamento em segundo plano

Comumente, os jogos precisam carregar recursos de forma assíncrona. Ao alternar a cena principal do seu jogo (por exemplo, ir para um novo nível), você pode querer exibir uma tela de carregamento com alguma indicação de que o progresso está sendo feito, ou pode querer carregar recursos adicionais durante a gameplay.

O método padrão de carregamento (ResourceLoader.load ou o mais simples load do GDScript) bloqueia a sua thread, fazendo com que o jogo pareça não responder enquanto o recurso está sendo carregado.

Uma maneira de contornar isso é usar ResourceLoader para carregar recursos de forma concorrente(assíncrona) em partes_paralelizáveis no segundo plano.

Usando ResourceLoader

Geralmente, você enfileira solicitações para carregar recursos para um caminho usando ResourceLoader.load_threaded_request, que será então carregado em partes_paralelizáveis em segundo plano.

Você pode verificar o status com ResourceLoader.load_threaded_get_status. O progresso pode ser obtido passando uma variável de array via progresso, que retornará um array de um elemento contendo a porcentagem.

Por fim, você recupera os recursos carregados chamando ResourceLoader.load_threaded_get.

Assim que você chama load_threaded_get(), o recurso terminou de carregar em segundo plano e será retornado instantaneamente ou o carregamento será bloqueado neste ponto, como o load() faria. Se você quiser garantir que isso não bloqueie, precisa garantir que haja tempo suficiente entre a solicitação do carregamento e a recuperação do recurso, ou precisa verificar o status manualmente.

Exemplo

Este exemplo demonstra como carregar uma cena em segundo plano. Faremos um botão gerar um inimigo quando pressionado. O inimigo será o Enemy.tscn, que carregaremos no _ready e instanciaremos quando pressionado. O caminho será "Enemy.tscn", localizado em res://Enemy.tscn.

Primeiro, iniciaremos uma solicitação para carregar o recurso e conectaremos o botão:

const ENEMY_SCENE_PATH : String = "Enemy.tscn"

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

Agora _on_button_pressed será chamado quando o botão for pressionado. Este método será usado para gerar um inimigo.

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)