Профилирование через Stats.js и Phaser Debug Plugin

Для мониторинга производительности игры и выявления узких мест используется библиотека Stats.js. Она позволяет визуально отображать FPS, время рендеринга и другие показатели в реальном времени.

Установка и подключение

Stats.js можно подключить через npm:

npm install stats.js

Или добавить через CDN:

<script src="https://cdnjs.cloudflare.com/ajax/libs/stats.js/r17/Stats.min.js"></script>

После подключения создается экземпляр Stats и добавляется в DOM:

const stats = new Stats();
stats.showPanel(0); // 0 — FPS, 1 — миллисекунды, 2 — память
document.body.appendChild(stats.dom);

Использование с игровым циклом Phaser

Для корректного профилирования каждый кадр нужно оборачивать в stats.begin() и stats.end():

this.events.on('step', () => {
    stats.begin();

    // основной игровой код

    stats.end();
});

Использование Stats.js вместе с Phaser позволяет отследить производительность сцены, выявить падение FPS при большом количестве объектов или тяжелой анимации.


Phaser Debug Plugin

Phaser предоставляет встроенный Debug Plugin, который упрощает визуализацию и диагностику объектов на сцене.

Включение плагина

В Phaser 3 Debug Plugin добавляется через конфигурацию сцены:

this.plugins.installScenePlugin({
    key: 'DebugPlugin',
    plugin: Phaser.Plugins.DebugPlugin,
    mapping: 'debug'
});

После этого объект this.debug становится доступен в сцене.

Основные возможности

  • Отображение тела физики: this.debug.body(sprite) Позволяет увидеть границы физического тела объекта, полезно при работе с Arcade Physics и Matter.js.

  • Отрисовка коллайдеров:

    this.debug.geom(collider.getBounds(), 0xff0000);

    Выводит границы коллайдеров, помогает выявить ошибки при пересечении объектов.

  • Вывод информации о спрайте:

    this.debug.spriteInfo(sprite, 32, 32);

    Показывает позицию, размер и активность объекта на экране.

  • Отображение текста и графических элементов: Можно комбинировать с this.add.graphics() для отрисовки линий, прямоугольников и других форм для отладки.


Профилирование производительности сцены

Совмещение Stats.js и Debug Plugin позволяет получить полный контроль над производительностью:

  1. FPS и время кадра: Stats.js показывает реальное время обработки кадра.
  2. Визуализация объектов: Debug Plugin помогает понять, какие объекты создают нагрузку на рендеринг.
  3. Определение узких мест: Комбинированное использование позволяет выявлять сцены или объекты с высокой нагрузкой.

Пример интеграции

class GameScene extends Phaser.Scene {
    constructor() {
        super({ key: 'GameScene' });
    }

    preload() {
        this.load.image('player', 'assets/player.png');
    }

    create() {
        // Stats.js
        this.stats = new Stats();
        this.stats.showPanel(0);
        document.body.appendChild(this.stats.dom);

        // Debug Plugin
        this.plugins.installScenePlugin({
            key: 'DebugPlugin',
            plugin: Phaser.Plugins.DebugPlugin,
            mapping: 'debug'
        });

        this.player = this.physics.add.sprite(100, 100, 'player');
    }

    update() {
        this.stats.begin();

        // Движение игрока и логика
        this.player.x += 1;

        // Отладка тела
        this.debug.body(this.player);

        this.stats.end();
    }
}

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


Продвинутые техники

Отслеживание большого количества объектов

При большом количестве спрайтов Debug Plugin может замедлять игру. Используется выборочная отладка:

if (this.player.x > 200) {
    this.debug.body(this.player);
}

Это позволяет профилировать только ключевые объекты.

Логирование статистики в консоль

Для анализа производительности можно выводить данные из Stats.js в консоль:

console.log(`FPS: ${Math.round(stats.getFPS())}`);

Комбинация с другими инструментами

  • Chrome DevTools: Можно профилировать рендеринг и события ввода.
  • Phaser Profiler Plugin: Дополняет Stats.js и Debug Plugin, предоставляя графики времени обновления и рендеринга каждой системы.

Практические рекомендации

  • Всегда отключать Debug Plugin и Stats.js на продакшн-сборке.
  • Использовать выборочную визуализацию для снижения нагрузки при профилировании больших сцен.
  • Периодически проверять FPS при добавлении новых объектов или эффектов.
  • Комбинировать визуальную отладку и логику с измерением времени выполнения функций через console.time() для глубокого анализа производительности.

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