TextureManager: устройство и API

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


Основные функции TextureManager

  1. Загрузка текстур TextureManager предоставляет методы для загрузки различных типов графических ресурсов:

    • load.image(key, url) — загружает одиночное изображение по URL и присваивает ему уникальный ключ key.
    • load.spritesheet(key, url, { frameWidth, frameHeight }) — загружает спрайт-лист с заданными размерами кадров.
    • load.atlas(key, textureURL, atlasURL) — загружает атлас текстур, где atlasURL содержит данные о расположении кадров.
  2. Хранение и доступ Загруженные текстуры сохраняются в памяти и доступны по ключу. Основные методы для работы с ними:

    • get(key) — возвращает объект текстуры по ключу.
    • exists(key) — проверяет наличие текстуры в менеджере.
    • remove(key) — удаляет текстуру и освобождает ресурсы.
  3. Управление кадрами спрайтов Для спрайт-листов и атласов TextureManager предоставляет API для работы с отдельными кадрами:

    • getFrame(key, frame) — возвращает конкретный кадр по имени или индексу.
    • add(key, source, width, height) — добавляет новую текстуру или кадр из исходного изображения.
    • removeFrame(key, frame) — удаляет кадр из текстуры без удаления всей текстуры.
  4. Обновление и манипуляции с текстурами TextureManager позволяет изменять текстуры в реальном времени:

    • update(key, source) — заменяет существующую текстуру новым изображением.
    • refresh(key) — обновляет данные текстуры в GPU, чтобы изменения отображались при рендеринге.
  5. Группировка и атласы Атласы текстур позволяют объединять множество изображений в один файл, что повышает производительность:

    • Атлас создается через load.atlas или addAtlas, а доступ к кадрам осуществляется через getFrame.
    • Это уменьшает количество переключений текстур на GPU, что критично для сложных сцен с большим количеством спрайтов.

Работа с событиями TextureManager

TextureManager генерирует события для отслеживания состояния текстур:

  • on('add', callback) — вызывается при добавлении новой текстуры.
  • on('remove', callback) — срабатывает при удалении текстуры.
  • on('update', callback) — вызывается при обновлении текстуры.

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


Практические примеры использования

Добавление изображения и проверка его наличия:

this.textures.addImage('player', 'assets/player.png');

if (this.textures.exists('player')) {
    console.log('Текстура игрока загружена');
}

Работа с кадрами спрайт-листа:

this.textures.addSpriteSheet('explosion', 'assets/explosion.png', {
    frameWidth: 64,
    frameHeight: 64
});

let frame = this.textures.getFrame('explosion', 3);
console.log(frame.name, frame.width, frame.height);

Создание и использование атласа:

this.textures.addAtlas('gameAtlas', 'assets/atlas.png', 'assets/atlas.json');

let playerFrame = this.textures.getFrame('gameAtlas', 'player_idle');

Архитектурные особенности

  • Кэширование: Все текстуры кэшируются в памяти и доступ к ним выполняется по ключу. Это минимизирует повторную загрузку ресурсов.
  • Оптимизация GPU: TextureManager автоматически управляет загрузкой текстур в видеопамять, что уменьшает задержки при рендеринге.
  • Гибкость: Можно добавлять текстуры динамически, удалять или обновлять существующие, что позволяет создавать живую, адаптивную графику для игр.

Взаимодействие с другими системами Phaser

  • Sprite и Image объекты используют текстуры через ключи, полученные от TextureManager.
  • Animation Manager опирается на кадры спрайт-листов и атласов, управляемых TextureManager.
  • Render System напрямую работает с текстурами в GPU, используя данные из TextureManager.

TextureManager является ядром графического управления Phaser, обеспечивая эффективное хранение, доступ и управление текстурами, что позволяет создавать высокопроизводительные игры с динамической графикой. Его API сочетает удобство использования с глубокой гибкостью, позволяя работать как с простыми изображениями, так и с комплексными атласами и анимациями.