О чем этот пример

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

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        const style = { font: '16px Courier', fill: '#00ff00' };

        this.add.text(10, 10, 'WebGL Config', { font: '32px Courier', fill: '#00ff00' });

        this.add.text(10, 60, [ 'Supported Extensions', '--------------------', '' ].concat(this.renderer.supportedExtensions), style);

        const config = [];

        for (let key in this.renderer.config)
        {
            config.push(`${key}: ${this.renderer.config[key]}`);
        }

        this.add.text(500, 60, [ 'Renderer Config', '---------------', '' ].concat(config), style);

        const compression = [];

        for (let key in this.renderer.compression)
        {
            compression.push(`${key}: ${this.renderer.compression[key]}`);
        }

        this.add.text(500, 300, [ 'Texture Compression', '-------------------', '' ].concat(compression), style);

        this.add.text(500, 450, [ 'WebGL Textures', '--------------', '', `Max Textures: ${this.renderer.maxTextures}`, `Max Texture Size: ${this.renderer.getMaxTextureSize()}` ], style);
    }
}

const config = {
    type: Phaser.WEBGL,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Доступ к свойствам рендерера

В Phaser 3 объект this.renderer в сцене предоставляет доступ к низкоуровневой информации о графическом рендерере. Этот объект особенно полезен при использовании WebGL-рендера (Phaser.WEBGL).

Основные свойства, которые можно получить: - supportedExtensions: массив строк с названиями расширений WebGL, поддерживаемых браузером. - config: объект с конфигурацией рендерера, установленной при создании игры. - compression: информация о поддержке сжатия текстур. - maxTextures: максимальное количество текстур, которые можно одновременно использовать в шейдере. - getMaxTextureSize(): метод, возвращающий максимальный размер текстуры (в пикселях).

const extensions = this.renderer.supportedExtensions;
const maxTextures = this.renderer.maxTextures;
const maxSize = this.renderer.getMaxTextureSize();

Получение списка расширений WebGL

Расширения WebGL добавляют специфические возможности, такие как продвинутое сжатие текстур или специальные буферы. Их поддержка зависит от браузера и видеокарты. Phaser автоматически определяет доступные расширения и сохраняет их в supportedExtensions.

В примере этот список выводится на экран. Это полезно для отладки и для условной логики, когда определенные функции игры требуют конкретных расширений.

this.add.text(10, 60, [ 'Supported Extensions', '--------------------', '' ].concat(this.renderer.supportedExtensions), style);

Анализ конфигурации и сжатия текстур

Объект config содержит параметры, с которыми был инициализирован рендерер Phaser. Это полезно, чтобы убедиться, что игра запустилась с ожидаемыми настройками (например, с антиалиасингом).

Объект compression хранит информацию о том, какие алгоритмы сжатия текстур (например, S3TC, PVRTC, ETC) поддерживаются текущим окружением. Это ключевая информация для оптимизации загрузки ресурсов на мобильных устройствах.

Код ниже перебирает свойства этих объектов и форматирует их для отображения.

const config = [];
for (let key in this.renderer.config)
{
    config.push(`${key}: ${this.renderer.config[key]}`);
}

const compression = [];
for (let key in this.renderer.compression)
{
    compression.push(`${key}: ${this.renderer.compression[key]}`);
}

Практическое применение: адаптивная графика

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

1. **Выбор качества текстур:** Если getMaxTextureSize() возвращает небольшое значение, можно загружать текстуры меньшего разрешения. 2. **Включение функций:** Проверить наличие supportedExtensions перед использованием специфичных эффектов. 3. **Оптимизация памяти:** Знание maxTextures помогает планировать атласы спрайтов и избегать переполнения лимитов.

Пример условной логики:

create() {
    const maxSize = this.renderer.getMaxTextureSize();
    let textureQuality = 'high';
    if (maxSize < 4096) {
        textureQuality = 'medium';
    }
    if (maxSize < 2048) {
        textureQuality = 'low';
    }
    this.load.setPath(`assets/${textureQuality}/`);
    // ... дальнейшая загрузка
}

Что попробовать дальше

Доступ к информации о WebGL через this.renderer — мощный инструмент для создания стабильных и оптимизированных игр под разные устройства. Поэкспериментируйте: создайте меню "Графические настройки", которое автоматически определяет максимальные возможности системы, или реализуйте плавную деградацию качества, если расширения (например, для сжатия текстур) не поддерживаются.