AssetRegistry: регистрация, поиск, удаление

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

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

В PlayCanvas регистрация ассетов — это процесс, при котором новый ресурс добавляется в реестр и становится доступным для использования в проекте. Для этого PlayCanvas предоставляет объект AssetRegistry, через который можно управлять всеми ассетами в приложении.

Регистрация ассетов осуществляется через метод register(). Этот метод принимает два основных параметра: тип ассета и его идентификатор.

Пример регистрации текстуры:

var texture = new pc.Asset('textureName', 'texture', {
    url: 'assets/texture.jpg'
});

app.assets.add(texture);

В этом примере создается новый ассет типа texture с названием textureName. Далее этот ассет добавляется в реестр через метод add(). После того как ассет добавлен, его можно использовать в любом месте проекта, получая доступ через AssetRegistry.

Типы ассетов

PlayCanvas поддерживает различные типы ассетов, среди которых можно выделить:

  • Текстуры (Texture): изображения, используемые для наложения на 3D-объекты.
  • Модели (Model): геометрия объектов.
  • Скрипты (Script): логика и поведение, реализованные с помощью JavaScript.
  • Звуки (Sound): аудиофайлы.
  • Материалы (Material): описание визуальных свойств объектов.
  • Шейдеры (Shader): пользовательские программы, используемые для рендеринга.

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

Поиск ассетов

После того как ассет был зарегистрирован в реестре, его можно найти и использовать в проекте. Для поиска ассетов в PlayCanvas используется метод find(). Этот метод позволяет найти ассет по его имени или идентификатору.

Пример поиска ассета по имени:

var texture = app.assets.find('textureName');

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

Для поиска ассетов можно также использовать другие методы, например:

  • findById(id): поиск по уникальному идентификатору ассета.
  • findByUrl(url): поиск ассета по URL-адресу.

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

Удаление ассетов

Удаление ассетов из реестра происходит с помощью метода remove(). Этот метод удаляет ассет по его имени или идентификатору. Удаление ассета важно для освобождения памяти и предотвращения утечек ресурсов в проекте.

Пример удаления ассета:

var texture = app.assets.find('textureName');
if (texture) {
    app.assets.remove(texture);
}

Если ассет был удален, он больше не будет доступен для использования в проекте, и доступ к нему через метод find() вернет null. Важно учитывать, что удаление ассета не приведет к его удалению с сервера или из файловой системы; оно лишь убирает ссылку на объект в реестре PlayCanvas.

Удаление ассетов по URL

Если необходимо удалить ассеты, загруженные с определенного URL, это можно сделать с помощью метода removeByUrl(). Это удобно, когда необходимо управлять ресурсами, загружаемыми динамически.

Пример:

app.assets.removeByUrl('assets/texture.jpg');

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

Загрузка и асинхронное использование ассетов

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

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

Пример загрузки ассета с коллбеком:

app.assets.load(texture, function() {
    console.log('Текстура загружена');
});

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

Кеширование ассетов

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

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

Ограничения и управление ресурсами

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

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

Работа с асинхронной загрузкой и прогрессом

PlayCanvas предоставляет методы для отслеживания состояния загрузки ассетов. С помощью loadFromUrl() можно указать прогресс загрузки и выполнить действия на каждом этапе.

Пример отслеживания прогресса загрузки:

app.assets.load(texture);
texture.on('load', function () {
    console.log('Текстура загружена');
});
texture.on('error', function () {
    console.log('Ошибка загрузки текстуры');
});

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

Заключение

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