Менеджер ресурсов: pc.AssetRegistry

pc.AssetRegistry — это важная часть системы управления ресурсами в PlayCanvas. Эта библиотека позволяет эффективно работать с различными типами ресурсов (текстуры, модели, скрипты и т.д.) в процессе разработки игр и интерактивных приложений. Она представляет собой хранилище для всех активных ресурсов, используемых в проекте, и обеспечивает удобное управление их загрузкой, выгрузкой и доступом.

Основные функции pc.AssetRegistry

Основная цель pc.AssetRegistry — хранение и управление ресурсами. Ключевые операции, которые он выполняет:

  • Регистрация ресурсов — добавление нового ресурса в систему.
  • Получение ресурсов — доступ к уже загруженным и зарегистрированным ресурсам.
  • Загрузка и выгрузка — асинхронная загрузка ресурсов в память и освобождение их, когда они больше не нужны.
  • Слежение за состоянием ресурсов — отслеживание статуса загрузки, ошибок и успешности операций.

Регистрация и загрузка ресурсов

Для того чтобы начать работать с ресурсами в PlayCanvas, их необходимо зарегистрировать. Ресурсы можно загрузить несколькими способами, но основным инструментом для их управления является метод add().

const asset = new pc.Asset('asset_name', 'model', {
    url: 'path/to/model.glb'
});

asset.on('load', function () {
    console.log('Модель успешно загружена');
});

asset.on('error', function (err) {
    console.error('Ошибка загрузки модели', err);
});

app.assets.add(asset);
app.assets.load(asset);

В приведённом примере создаётся новый ресурс типа model с именем asset_name. Он указывает на файл модели в формате .glb. После регистрации и добавления ресурса в менеджер (app.assets.add()), вызывается метод load(), который начинает асинхронную загрузку модели.

Методы on('load') и on('error') позволяют обработать события успешной загрузки и ошибки, соответственно.

Получение и доступ к ресурсам

После того как ресурсы загружены, можно получить доступ к ним через метод find():

const asset = app.assets.find('asset_name');

Если ресурс зарегистрирован и загружен, find() вернёт объект ресурса, который можно использовать в дальнейшем для отображения или манипуляции.

Для асинхронного получения ресурсов, если они ещё не загружены, используется метод load():

app.assets.load(asset).then(() => {
    const model = asset.resource;
    // работа с моделью
});

Метод load() гарантирует, что ресурс будет загружен перед его использованием.

Выгрузка и освобождение ресурсов

В случае, когда ресурс больше не используется, его можно выгрузить из памяти. Это предотвращает излишнюю нагрузку на систему и освобождает ресурсы. Для этого используется метод unload():

app.assets.remove(asset);
asset.unload();

Метод remove() удаляет ресурс из списка активных ресурсов, а unload() выгружает его из памяти. Выгрузка полезна для управления ресурсами в процессе игры, например, когда сцена меняется, и старые активы становятся ненужными.

Кэширование и оптимизация

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

if (!app.assets.find('asset_name')) {
    app.assets.load(asset);
}

Этот код проверяет, зарегистрирован ли ресурс в системе, и если его нет, выполняет его загрузку.

Управление зависимостями

Ресурсы могут иметь зависимости, например, текстуры, использующиеся в модели, или скрипты, которые зависят от других библиотек. В таких случаях pc.AssetRegistry автоматически отслеживает эти зависимости и загружает их в нужной последовательности. Для управления зависимостями можно использовать событие load на уровне ресурса:

const textureAsset = new pc.Asset('texture', 'texture', {
    url: 'path/to/texture.jpg'
});

textureAsset.on('load', function () {
    // текстура загружена
});

app.assets.load(textureAsset);

Если текстура используется в другом ресурсе (например, в модели), PlayCanvas автоматически позаботится о загрузке этой текстуры перед загрузкой модели.

Ошибки и обработка исключений

В процессе работы с pc.AssetRegistry могут возникать ошибки, такие как проблемы с загрузкой файлов или отсутствие нужных ресурсов. Для правильной обработки ошибок важно подписываться на событие error:

asset.on('error', function (err) {
    console.error('Ошибка загрузки ресурса:', err);
});

Это позволит своевременно обработать возникающие проблемы и, при необходимости, предпринять меры по их исправлению, например, запросить повторную загрузку или предоставить пользователю сообщения об ошибках.

Рабочие циклы и события

Система PlayCanvas использует событийный подход, позволяя легко отслеживать изменения состояний и уведомлять приложение о том, что произошло в процессе работы с ресурсами. Например, можно отслеживать, когда все ресурсы были загружены:

app.assets.load(assets).then(function () {
    console.log('Все ресурсы загружены');
});

В случае с большим количеством ресурсов можно использовать метод load() с массивом активов. Это позволяет избежать блокировки интерфейса и улучшить производительность приложения.

Особенности работы с различными типами ресурсов

pc.AssetRegistry поддерживает множество типов ресурсов, каждый из которых может требовать особого подхода к обработке. Вот некоторые из наиболее распространённых типов:

  • Модели: Используются для 3D-объектов, таких как персонажи, сцены или интерактивные элементы.
  • Текстуры: Используются для наложения изображений на 3D-модели или 2D-спрайты.
  • Скрипты: Управляют логикой поведения объектов в игре или приложении.
  • Аудио: Используются для воспроизведения звуковых эффектов и музыки.
  • Шейдеры: Специальные программы для обработки графики, которые могут изменять внешний вид объектов и сцен.

Каждый тип ресурса имеет свои особенности загрузки и использования, но общая структура управления остается одинаковой для всех.

Поддержка асинхронных операций

Загрузка и обработка ресурсов в PlayCanvas выполняются асинхронно, что позволяет эффективно работать с большими объёмами данных. Это также означает, что приложение остаётся отзывчивым, даже когда выполняются операции с множеством активов.

Использование промисов позволяет удобно обрабатывать последовательные операции загрузки:

app.assets.load([modelAsset, textureAsset])
    .then(function () {
        // обработка после загрузки всех ресурсов
    })
    .catch(function (error) {
        // обработка ошибок
    });

Асинхронный подход помогает избежать блокировки основного потока приложения, что особенно важно для игр и интерактивных приложений, где требуется высокая производительность и отзывчивость интерфейса.

Итоговые замечания

pc.AssetRegistry представляет собой мощный инструмент для эффективного управления ресурсами в PlayCanvas. Он предоставляет гибкие механизмы для работы с загрузкой, выгрузкой и кэшированием ресурсов, а также поддерживает обработку ошибок и зависимостей между активами. Правильное использование этого менеджера позволяет значительно улучшить производительность приложений и упрощает управление большими объёмами данных.