Phaser использует Canvas и WebGL для отрисовки графики в браузере. В основе Canvas лежит концепция immediate mode rendering: каждый кадр сцены полностью перерисовывается. Это означает, что любая неэффективная работа с объектами на сцене напрямую увеличивает нагрузку на процессор и GPU, снижая производительность.
Ключевые элементы рендеринга:
Минимизация перерисовки Canvas критически важна при больших сценах и динамических интерфейсах.
1. Использование статических спрайтов
Если объект не изменяет позицию, масштаб или прозрачность, его можно отрисовать один раз на Render Texture. Render Texture — это отдельный Canvas, на который можно рендерить один или несколько объектов, а затем просто отображать этот Canvas как спрайт. Это уменьшает количество операций перерисовки на основном Canvas.
const renderTexture = this.add.renderTexture(0, 0, 800, 600);
renderTexture.draw(sprite);
Преимущества:
2. Группировка и контейнеры
Phaser предоставляет Container, который объединяет
несколько объектов в один. Изменение позиции контейнера перемещает сразу
все дочерние объекты, при этом внутренняя перерисовка может быть
оптимизирована.
const container = this.add.container(100, 100);
container.add([sprite1, sprite2, text]);
container.setScale(2);
Использование контейнеров снижает количество операций трансформации и упрощает управление объектами.
1. Статический текст и графика
Текстовые объекты и графика, которые не изменяются каждый кадр, лучше отрисовывать один раз на Render Texture:
const graphics = this.add.graphics();
graphics.fillStyle(0xff0000);
graphics.fillRect(0, 0, 100, 100);
renderTexture.draw(graphics);
graphics.destroy(); // можно удалить, так как больше не нужен
2. Ограничение изменений свойств
Любое изменение позиции, масштаба, угла или альфа-канала вызывает перерисовку. Изменять свойства объектов следует только при необходимости:
setVisible(false) вместо удаления
объекта.Для сцен с тайловыми картами (Tilemap) Phaser автоматически использует culling, чтобы рендерить только видимые тайлы. Дополнительные рекомендации:
StaticTilemapLayer для слоев, которые не
изменяются динамически.const layer = map.createStaticLayer('ground', tileset, 0, 0);
StaticTilemapLayer отрисовывается один раз и значительно снижает нагрузку на Canvas.
Анимации в Phaser создаются с помощью AnimationManager и
могут быть ресурсоёмкими при множестве объектов:
this.anims.create({
key: 'walk',
frames: this.anims.generateFrameNumbers('hero', { start: 0, end: 5 }),
frameRate: 10,
repeat: -1
});
Если спрайт не двигается, анимацию лучше остановить и отобразить статичный кадр.
Использование Layer и Display List
позволяет управлять порядком отрисовки без лишних пересчётов:
const uiLayer = this.add.layer();
uiLayer.add([button1, button2]);
Перерисовка Canvas тесно связана с системой событий Phaser:
scene.update только для объектов, которые
реально требуют изменений.setInteractive и
реагировать только на события пользователя, а не на каждый кадр.Эти подходы позволяют значительно снизить нагрузку на Canvas и обеспечить плавный фреймрейт даже при сложных сценах с большим количеством объектов.