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.

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

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

Стандартный метод загрузки (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)