Фоновая загрузка

Обычно играм необходимо загружать ресурсы асинхронно. При переключении основной сцены вашей игры (например, при переходе на новый уровень) вы можете захотеть отобразить экран загрузки с некоторой индикацией прогресса или загрузить дополнительные ресурсы во время игры.

Стандартный метод загрузки (ResourceLoader.load или более простой метод GDScript load) блокирует ваш поток, из-за чего ваша игра выглядит неотзывчивой во время загрузки ресурса.

Одним из способов решения этой проблемы является использование ResourceLoader для асинхронной загрузки ресурсов в фоновых потоках.

Использование ResourceLoader

Обычно запросы на загрузку ресурсов для пути ставятся в очередь с помощью ResourceLoader.load_threaded_request, которые затем будут загружены в потоках в фоновом режиме.

Вы можете проверить статус с помощью ResourceLoader.load_threaded_get_status. Прогресс можно получить, передав переменную-массив через progress, которая вернет массив из одного элемента, содержащий процентное значение.

Наконец, вы извлекаете загруженные ресурсы, вызывая ResourceLoader.load_threaded_get.

После вызова load_threaded_get() ресурс либо загрузится в фоновом режиме и будет мгновенно возвращён, либо загрузка заблокируется на этом этапе, как это произошло бы с load(). Чтобы гарантировать отсутствие блокировки, необходимо либо обеспечить достаточный интервал между запросом загрузки и получением ресурса, либо вручную проверить статус загрузки.

Пример

В этом примере показано, как загрузить сцену на заднем плане. Кнопка будет создавать врага при нажатии. Враг будет Enemy.tscn, который будет загружен при _ready и создан при нажатии. Путь будет "Enemy.tscn", он расположен по адресу res://Enemy.tscn.

Для начала запустим запрос на загрузку ресурса и подключим кнопку:

const ENEMY_SCENE_PATH : String = "Enemy.tscn"

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

Теперь при нажатии кнопки будет вызываться метод _on_button_pressed. Этот метод будет использоваться для создания врага.

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)