v4-new-features
phaserjs/phaser
Используйте этот навык при изучении новых функций, игровых объектов, компонентов и возможностей рендеринга, добавленных в Phaser 4. В курсе рассматриваются фильтры, RenderNodes, CaptureFrame, Gradient, Noise, SpriteGPULayer, TilemapGPULayer, компонент Lighting, RenderSteps и новые режимы оттенков. Триггеры: нововведения в версии 4, функции Phaser 4, RenderNode, SpriteGPULayer, CaptureFrame, игровой объект Gradient, игровой объект Noise, новые режимы оттенков. Для переноса кода из версии 3 в версию 4 см. навык «Перенос кода из v3 в v4».
...Расширить всеНовые функции Phaser 4
Новые функции и возможности Phaser 4: Фильтры (заменяющие FX/BitmapMask), RenderNodes (заменяющие Pipelines), игровые объекты CaptureFrame, Gradient, Noise, SpriteGPULayer, TilemapGPULayer, компонент Lighting, RenderSteps и новые режимы оттенков.
Связанные навыки:../v3-to-v4-migration/SKILL.md, ../filters-and-postfx/SKILL.md, ../game-object-components/SKILL.md, ../tilemaps/SKILL.md
Переходите с версии v3? Ознакомьтесь с Руководством по переходу с v3 на v4, где приведены пошаговые инструкции по изменению кода, список удалённых API и контрольный список для перехода.
Обзор: что изменилось в версии v4
Phaser 4 представляет собой полную переработку движка рендеринга WebGL. В версии v3 каждый подсистемный компонент управлял состоянием WebGL независимо, что приводило к конфликтам (например, некоторые эффекты нарушали работу масок). В версии v4 управление состоянием WebGL централизовано с помощью графа RenderNode, в котором каждый узел обрабатывает ровно одну задачу рендеринга.
Основные удаления
Основные дополнения
- Новые GameObjects:
CaptureFrame,Gradient,Noise,NoiseCell2D/3D/4D,NoiseSimplex2D/3D,SpriteGPULayer,Stamp,TilemapGPULayer - Новые компоненты:
Lighting,RenderSteps,RenderNodes - Новые режимы оттенка:
MULTIPLY,FILL,ADD,SCREEN,OVERLAY,HARD_LIGHT - Новые фильтры: Blend, Blocky, CombineColorMatrix, GradientMap, ImageLight, Key, Mask, NormalTools, PanoramaBlur, ParallelFilters, Quantize, Sampler, Threshold
- Ориентация GL: в версии 4 используется стандартная ориентация GL (Y=0 внизу для текстур)
Система фильтров (заменяет FX и BitmapMask)
Полное руководство:
filters-and-postfx.md
Фильтры объединяют системы FX и Mask версии v3. Каждый фильтр принимает входное изображение и генерирует выходное изображение посредством прохода шейдера. Фильтры можно применять к любому игровому объекту или камере — в версии v3 существовали ограничения на то, какие объекты поддерживали FX.
// Подход v3 (FX):
sprite.preFX.addGlow(0xff00ff, 4);
sprite.postFX.addBlur(0, 2, 2, 1);// Подход v4 (фильтры):
sprite.enableFilters();
sprite.filters.internal.addGlow(0xff00ff, 4, 0, 1);
sprite.filters.external.addBlur(0, 2, 2, 1);// Подход версии 3 (BitmapMask):
const mask = new Phaser.Display.Masks.BitmapMask(scene, maskImage);
sprite.setMask(mask);// Подход v4 (FilterMask):
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);
Внутренние и внешние фильтры: внутренние фильтры запускаются до преобразования камеры (локальное пространство объекта, меньшая нагрузка). Внешние фильтры запускаются после (пространство экрана, полное разрешение).
RenderNodes (замена конвейеров)
В версии v3 конвейер представлял собой систему рендеринга, которая часто выполняла несколько задач. В версии v4 каждый RenderNode обрабатывает одну задачу рендеринга с помощью метода run(). Некоторые узлы также имеют метод batch() для накопления состояния перед рисованием.
Архитектура
RenderNodeManager (в рендерере WebGL) управляет всеми узлами рендеринга. Игровые объекты обращаются к узлам через карты, основанные на ролях.
// Роли RenderNode на игровом объекте:
// - «Submitter»: запускает другие роли узлов для каждого элемента
// - «Transformer»: предоставляет координаты вершин
// - «Texturer»: обрабатывает текстуры// Игровые объекты имеют карты узлов рендеринга по умолчанию и настраиваемые:
gameObject.defaultRenderNodes // встроенные узлы по ролям
gameObject.customRenderNodes // переопределения по ролям
gameObject.renderNodeData // данные, индексированные по имени узла
Настройка пользовательских узлов рендеринга
// Переопределить конкретную роль узла рендеринга:
gameObject.setRenderNodeRole('Submitter', 'MyCustomSubmitter');// Передать данные узлу рендеринга:
gameObject.setRenderNodeRole('Transformer', 'MyTransformer', {
customProperty: 42
});// Удаление пользовательского узла (используется значение по умолчанию):
gameObject.setRenderNodeRole('Submitter', null);
Встроенные типы узлов рендеринга
Обработчики пакетов (накапливают и рисуют несколько объектов за один вызов рисования):
BatchHandlerQuad— стандартная пакетная обработка четырехугольников (Image, Sprite, BitmapText и т. д.)BatchHandlerQuadSingle— вариант с одним квадрантомBatchHandlerTileSprite— пакетная обработка TileSpriteBatchHandlerTriFlat— пакетная обработка плоских треугольников (Graphics, Shape)BatchHandlerPointLight— пакетная обработка точечных источников светаBatchHandlerStrip— пакетная обработка полос треугольников
Submitters (координатное рендеринг по типу объекта):
SubmitterQuad,SubmitterTile,SubmitterTileSpriteSubmitterSpriteGPULayer,SubmitterTilemapGPULayer
Трансформаторы (вычисление координат вершин):
TransformerImage,TransformerStamp,TransformerTile,TransformerTileSprite
Текстуризаторы (управление привязкой текстур):
TexturerImage,TexturerTileSprite
Фильтры (постобработка — см. filters-and-postfx.md):
BaseFilter,BaseFilterShaderFilterBarrel,FilterBlend,FilterBlocky,FilterBlur(варианты Low/Med/High)FilterBokeh,FilterColorMatrix,FilterCombineColorMatrixFilterDisplacement,FilterGlow,FilterGradientMap,FilterImageLightFilterKey,FilterMask,FilterNormalTools,FilterPanoramaBlurFilterParallelFilters,FilterPixelate,FilterQuantizeFilterSampler,FilterShadow,FilterThreshold,FilterVignette,FilterWipe
Прочее:
Camera,FillCamera,FillRect,FillPath,FillTriDrawLine,StrokePath,ShaderQuadListCompositor,RebindContext,YieldContextDynamicTextureHandler
Расширение: Пользовательские узлы рендеринга
// Регистрация конструктора пользовательского узла:
renderer.renderNodes.addNodeConstructor('MyNode', MyNodeClass);// Или добавление готового экземпляра узла:
renderer.renderNodes.addNode('MyNode', myNodeInstance);
Новые игровые объекты
CaptureFrame
Захватывает текущее содержимое фреймбуфера в текстуру в той точке списка отображения, где он находится. Сам по себе ничего не рендерит. Только для WebGL.
// Все, что находится выше этого в списке отображения, будет захвачено:
const image1 = this.add.image(400, 300, 'background');// Включить использование фреймбуфера на камере:
this.cameras.main.setForceComposite(true);// Создать точку захвата:
const capture = this.add.captureFrame('myCapturedTexture');// Использование захваченной текстуры на другом объекте:
const overlay = this.add.image(400, 300, 'myCapturedTexture');
// Добавление фильтров к наложению для искажения захваченной сцены
Важные детали:
- Требуется
camera.setForceComposite(true)или контекст фреймбуфера (фильтры, DynamicTexture, камера с частичным альфа-каналом) - Внутри контейнера с фильтрами захватывается только содержимое этого контейнера
- Установка
visible = falseостанавливает захват - Компоненты: BlendMode, Depth, RenderNodes, Visible
Источник: src/gameobjects/captureframe/CaptureFrame.js
Gradient
Отображает цветовые градиенты, прорисованные на GPU. Является производным от Shader. Поддерживает линейный, радиальный и другие режимы градиента с настраиваемым объектом ColorRamp, содержащим объекты ColorBand.
// Простой линейный градиент:
const grad = this.add.gradient(undefined, 100, 100, 200, 200);// Сложный радиальный градиент с несколькими цветовыми полосами:
const halo = this.add.gradient({
bands: [
{ start: 0.5, end: 0.6, colorStart: [0.5, 0.5, 1, 0], colorEnd: 0xffffff, colorSpace: 1, interpolation: 4 },
{ start: 0.6, end: 1, colorStart: 0xffffff, colorEnd: [1, 0.5, 0.5, 0], colorSpace: 1, interpolation: 3 }
],
dither: true,
repeatMode: 1,
shapeMode: 2, // радиальный
start: { x: 0.5, y: 0.5 },
shape: { x: 0.5, y: 0.0 }
}, 400, 300, 800, 800);// Анимация:
halo.offset = 0.1 * (1 + Math.sin(time / 1000));
Ключевые параметры:
- Конфигурация:
GradientQuadConfigс параметрамиbands,shapeMode,repeatMode,start,shape,dither - Цвета задаются с помощью
ColorRampс объектамиColorBand(поддерживает HSV, различные режимы интерполяции) - Вызов
gradient.ramp.encode()после изменения данных градиента во время выполнения
Источник: src/gameobjects/gradient/Gradient.js
Объекты шума
Все типы шума наследуются от Shader и доступны только в WebGL. Доступно шесть вариантов:
// Базовый белый шум:
const noise = this.add.noise({
noiseOffset: [0, 0],
noisePower: 1
}, 100, 100, 256, 256);// Клеточный шум с настройками:
const cells = this.add.noiseCell2D({
noiseOffset: [0, 0],
noiseIterations: 3,
noiseNormalMap: true // вывод в виде карты нормалей для освещения
}, 200, 200, 256, 256);// Шум Simplex для естественных эффектов:
const simplex = this.add.noiseSimplex2D({
noiseFlow: 0, // анимируйте этот параметр для эволюции
noiseIterations: 4,
noiseWarpAmount: 0.5, // турбулентность
noiseSeed: 42,
noiseNormalMap: false
}, 300, 300, 256, 256);
Общие свойства для всех типов шума:
noiseOffset— массив[x, y]для прокрутки узораnoisePower— регулирует уровни выходного сигнала (большее значение подавляет высокие значения)noiseNormalMap— выходная карта нормалей (для интеграции с освещением)noiseIterations— уровень детализации (для типов cellular/simplex)
Математические эквиваленты: Phaser.Math.Hash(), Phaser.Math.HashCell(), Phaser.Math.HashSimplex()
Источник: src/gameobjects/noise/
SpriteGPULayer
Осуществляет рендеринг очень большого количества квадров (до миллионов) за один вызов рисования, сохраняя данные в статическом буфере GPU. Работает до 100 раз быстрее, чем отдельные спрайты. Только для WebGL.
const layer = this.add.spriteGPULayer(texture, size); // size = максимальное количество элементов// Добавление элементов (делайте это за один раз, а не постепенно):
const member = { x: 100, y: 200, frame: 'tree', scaleX: 1, scaleY: 1, alpha: 1 };
layer.addMember(member);// Для эффективности при миллионах записей повторно используйте объект элемента:
member.x = 300;
member.y = 400;
member.frame = 'bush';
layer.addMember(member);// Включить освещение на слое:
layer.setLighting(true);
Ключевые детали:
- Только одна текстура (без мультиатласа), одно изображение на слой
- Члены поддерживают анимации типа твинов (затухание, отскок, волна, смена цвета), заданные при создании
- Обновление содержимого буфера требует значительных ресурсов — заполняйте его один раз и оставляйте без изменений
- Для пиксельной графики рекомендуется использовать текстуры размером, кратным двум, чтобы избежать видимых стыков
- Визуальное «удаление» элементов путем установки
scaleX/scaleY/alphaв 0 (это позволяет избежать перестроения буфера) - Компоненты: Alpha, BlendMode, Depth, ElapseTimer, Lighting, Mask, RenderNodes, TextureCrop, Visible
Источник: src/gameobjects/spritegpulayer/SpriteGPULayer.js
Новые компоненты
Полный справочник по компонентам:
game-object-components.md
Компонент освещения
Заменяет подход версии 3, в котором назначался конвейер освещения. Только для WebGL.
// Подход v3:
sprite.setPipeline('Light2D');// Подход v4:
sprite.setLighting(true);// Самозатенение (имитирует тени на поверхности на основе яркости текстуры):
sprite.setSelfShadow(true, 0.5,1/3);
// Аргументы: enabled, penumbra (чем меньше, тем четче), diffuseFlatThreshold (0–1)// Использовать общеигровое значение по умолчанию для самозатенения:
sprite.setSelfShadow(null); // считывается из config.render.selfShadow
Поддерживается в: BitmapText, Blitter, Graphics, Shape, Image, Sprite, Particles, SpriteGPULayer, Stamp, Text, TileSprite, Video, TilemapLayer, TilemapGPULayer.
Примечание по пакетной обработке: освещение изменяет шейдер, что нарушает пакеты. Для наилучшей производительности группируйте освещённые объекты вместе, а неосвещённые — отдельно.
Источник: src/gameobjects/components/Lighting.js
Компонент RenderSteps
Позволяет внедрять пользовательскую логику в процесс рендеринга игрового объекта. Только для WebGL. Система Filters использует RenderSteps внутренне.
// Добавление пользовательского шага рендеринга:
gameObject.addRenderStep(function (renderer, gameObject, drawingContext, parentMatrix, renderStep, displayList, displayListIndex) {
// Пользовательская логика рендеринга здесь
// Вызов следующего шага, когда все готово:
var nextFn = gameObject._renderSteps[renderStep + 1];
if (nextFn) {
nextFn(renderer, gameObject, drawingContext, parentMatrix, renderStep + 1, displayList, displayListIndex);
}
});
Ключевые моменты:
- Шаги хранятся в массиве
_renderStepsи выполняются с помощьюrenderWebGLStep() - Первый шаг запускается первым и отвечает за вызов последующих шагов
- Именно так фильтры откладывают и управляют потоком
renderWebGL
Источник: src/gameobjects/components/RenderSteps.js
Компонент RenderNodes
Предоставляет на игровых объектах карты defaultRenderNodes, customRenderNodes и renderNodeData. См. раздел «RenderNodes» выше для ознакомления с использованием.
Источник: src/gameobjects/components/RenderNodes.js
TilemapGPULayer
Полное руководство по тайл-мапам:
tilemaps.md
Высокопроизводительный рендеринг тайл-карты на базе GPU. Осуществляет рендеринг всего слоя в виде одного квадрата с помощью специализированного шейдера. Только для WebGL.
// Создание с помощью Tilemap с флагом gpu:
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tiles', 'tilesImage');
const gpuLayer = map.createLayer('Ground', tileset, 0, 0, true); // последний аргумент: gpu = true
Возможности:
- Один набор плиток с одним текстурным изображением
- Максимум 4096x4096 плиток, до 2^23 уникальных идентификаторов плиток
- Поддерживается зеркальное отражение плиток и анимация
- Только ортогональные карты тайлов (без изометрических/гексагональных)
- Идеальная фильтрация текстур в режиме LINEAR (без швов между плитками)
- Стоимость рассчитывается за пиксель, а не за плитку — отсутствие потери производительности при большом количестве видимых плиток
Ограничения:
- Невозможно использовать несколько наборов тайлов
- Для обновления при редактировании требуется ручной вызов
generateLayerDataTexture() - Только ортогографический режим
Внутренние данные: Данные тайлов хранятся в текстуре (4 байта на тайл: 2 бита переворачивания, 1 бит анимации, 1 неиспользуемый бит, 28-битный индекс тайла). Данные анимации — в отдельной текстуре.
Источник: src/tilemaps/TilemapGPULayer.js
Подробные параметры настройки, таблицы справочника API и карты исходных файлов см. в справочном руководстве.
Phaser 4 New Features
New features and capabilities in Phaser 4: Filters (replacing FX/BitmapMask), RenderNodes (replacing Pipelines), CaptureFrame, Gradient, Noise game objects, SpriteGPULayer, TilemapGPULayer, Lighting component, RenderSteps, and new tint modes.
Related skills: ../v3-to-v4-migration/SKILL.md, ../filters-and-postfx/SKILL.md, ../game-object-components/SKILL.md, ../tilemaps/SKILL.md
Migrating from v3? See the v3 to v4 Migration Guide for step-by-step code changes, removed APIs, and a migration checklist.
Overview: What Changed in v4
Phaser 4 is a complete overhaul of the WebGL rendering engine. The v3 renderer let each subsystem manage WebGL state independently, causing conflicts (e.g. certain FX breaking Masks). v4 centralizes WebGL state management through a RenderNode graph, where each node handles exactly one rendering task.
Key Removals
Key Additions
- New GameObjects:
CaptureFrame,Gradient,Noise,NoiseCell2D/3D/4D,NoiseSimplex2D/3D,SpriteGPULayer,Stamp,TilemapGPULayer - New Components:
Lighting,RenderSteps,RenderNodes - New Tint Modes:
MULTIPLY,FILL,ADD,SCREEN,OVERLAY,HARD_LIGHT - New Filters: Blend, Blocky, CombineColorMatrix, GradientMap, ImageLight, Key, Mask, NormalTools, PanoramaBlur, ParallelFilters, Quantize, Sampler, Threshold
- GL Orientation: v4 uses standard GL orientation (Y=0 at bottom for textures)
Filters System (Replacing FX and BitmapMask)
Full reference:
filters-and-postfx.md
Filters unify the v3 FX and Mask systems. Every filter takes an input image and produces an output image via a shader pass. Filters can be applied to any game object or camera -- v3 had restrictions on which objects supported FX.
// v3 approach (FX):
sprite.preFX.addGlow(0xff00ff, 4);
sprite.postFX.addBlur(0, 2, 2, 1);// v4 approach (Filters):
sprite.enableFilters();
sprite.filters.internal.addGlow(0xff00ff, 4, 0, 1);
sprite.filters.external.addBlur(0, 2, 2, 1);// v3 approach (BitmapMask):
const mask = new Phaser.Display.Masks.BitmapMask(scene, maskImage);
sprite.setMask(mask);// v4 approach (FilterMask):
sprite.enableFilters();
sprite.filters.internal.addMask(maskImage);
Internal vs External: Internal filters run before the camera transform (object-local space, cheaper). External filters run after (screen space, full-resolution).
RenderNodes (Replacing Pipelines)
In v3, a Pipeline was a rendering system that often handled multiple responsibilities. In v4, each RenderNode handles a single rendering task via its run() method. Some nodes also have a batch() method to accumulate state before drawing.
Architecture
The RenderNodeManager (on the WebGL renderer) owns all render nodes. Game objects reference nodes through role-based maps.
// RenderNode roles on a game object:
// - 'Submitter': runs other node roles for each element
// - 'Transformer': provides vertex coordinates
// - 'Texturer': handles textures// GameObjects have default and custom render node maps:
gameObject.defaultRenderNodes // built-in nodes per role
gameObject.customRenderNodes // overrides per role
gameObject.renderNodeData // data keyed by node name
Setting Custom RenderNodes
// Override a specific render role:
gameObject.setRenderNodeRole('Submitter', 'MyCustomSubmitter');// Pass data to a render node:
gameObject.setRenderNodeRole('Transformer', 'MyTransformer', {
customProperty: 42
});// Remove a custom node (falls back to default):
gameObject.setRenderNodeRole('Submitter', null);
Built-in RenderNode Types
Batch Handlers (accumulate and draw multiple objects per draw call):
BatchHandlerQuad-- standard quad batching (Image, Sprite, BitmapText, etc.)BatchHandlerQuadSingle-- single-quad variantBatchHandlerTileSprite-- TileSprite batchingBatchHandlerTriFlat-- flat triangle batching (Graphics, Shape)BatchHandlerPointLight-- point light batchingBatchHandlerStrip-- triangle strip batching
Submitters (coordinate rendering per object type):
SubmitterQuad,SubmitterTile,SubmitterTileSpriteSubmitterSpriteGPULayer,SubmitterTilemapGPULayer
Transformers (compute vertex positions):
TransformerImage,TransformerStamp,TransformerTile,TransformerTileSprite
Texturers (manage texture binding):
TexturerImage,TexturerTileSprite
Filters (post-processing -- see filters-and-postfx.md):
BaseFilter,BaseFilterShaderFilterBarrel,FilterBlend,FilterBlocky,FilterBlur(Low/Med/High variants)FilterBokeh,FilterColorMatrix,FilterCombineColorMatrixFilterDisplacement,FilterGlow,FilterGradientMap,FilterImageLightFilterKey,FilterMask,FilterNormalTools,FilterPanoramaBlurFilterParallelFilters,FilterPixelate,FilterQuantizeFilterSampler,FilterShadow,FilterThreshold,FilterVignette,FilterWipe
Other:
Camera,FillCamera,FillRect,FillPath,FillTriDrawLine,StrokePath,ShaderQuadListCompositor,RebindContext,YieldContextDynamicTextureHandler
Extending: Custom RenderNodes
// Register a custom node constructor:
renderer.renderNodes.addNodeConstructor('MyNode', MyNodeClass);// Or add a pre-built node instance:
renderer.renderNodes.addNode('MyNode', myNodeInstance);
New Game Objects
CaptureFrame
Captures the current framebuffer contents to a texture at the point in the display list where it sits. Does not render anything itself. WebGL only.
// Everything above this in the display list gets captured:
const image1 = this.add.image(400, 300, 'background');// Enable framebuffer usage on the camera:
this.cameras.main.setForceComposite(true);// Create the capture point:
const capture = this.add.captureFrame('myCapturedTexture');// Use the captured texture on another object:
const overlay = this.add.image(400, 300, 'myCapturedTexture');
// Add filters to the overlay to distort the captured scene
Key details:
- Requires
camera.setForceComposite(true)or a framebuffer context (Filters, DynamicTexture, camera with partial alpha) - Inside a Container with filters, captures only that Container's contents
- Setting
visible = falsestops capturing - Components: BlendMode, Depth, RenderNodes, Visible
Source: src/gameobjects/captureframe/CaptureFrame.js
Gradient
Displays GPU-rendered color gradients. Extends Shader. Supports linear, radial, and other shape modes with configurable ColorRamp containing ColorBand objects.
// Simple linear gradient:
const grad = this.add.gradient(undefined, 100, 100, 200, 200);// Complex radial gradient with multiple color bands:
const halo = this.add.gradient({
bands: [
{ start: 0.5, end: 0.6, colorStart: [0.5, 0.5, 1, 0], colorEnd: 0xffffff, colorSpace: 1, interpolation: 4 },
{ start: 0.6, end: 1, colorStart: 0xffffff, colorEnd: [1, 0.5, 0.5, 0], colorSpace: 1, interpolation: 3 }
],
dither: true,
repeatMode: 1,
shapeMode: 2, // radial
start: { x: 0.5, y: 0.5 },
shape: { x: 0.5, y: 0.0 }
}, 400, 300, 800, 800);// Animate:
halo.offset = 0.1 * (1 + Math.sin(time / 1000));
Key details:
- Config:
GradientQuadConfigwithbands,shapeMode,repeatMode,start,shape,dither - Colors defined via
ColorRampwithColorBandobjects (supports HSV, various interpolation modes) - Call
gradient.ramp.encode()after modifying ramp data at runtime
Source: src/gameobjects/gradient/Gradient.js
Noise Game Objects
All noise types extend Shader and are WebGL only. Six variants available:
// Basic white noise:
const noise = this.add.noise({
noiseOffset: [0, 0],
noisePower: 1
}, 100, 100, 256, 256);// Cellular noise with customization:
const cells = this.add.noiseCell2D({
noiseOffset: [0, 0],
noiseIterations: 3,
noiseNormalMap: true // output as normal map for lighting
}, 200, 200, 256, 256);// Simplex noise for natural effects:
const simplex = this.add.noiseSimplex2D({
noiseFlow: 0, // animate this for evolution
noiseIterations: 4,
noiseWarpAmount: 0.5, // turbulence
noiseSeed: 42,
noiseNormalMap: false
}, 300, 300, 256, 256);
Common properties across noise types:
noiseOffset--[x, y]array to scroll the patternnoisePower-- sculpt output levels (higher suppresses high values)noiseNormalMap-- output normal map (for lighting integration)noiseIterations-- detail level (cellular/simplex types)
Math equivalents: Phaser.Math.Hash(), Phaser.Math.HashCell(), Phaser.Math.HashSimplex()
Source: src/gameobjects/noise/
SpriteGPULayer
Renders very large numbers of quads (up to millions) in a single draw call by storing data in a static GPU buffer. Up to 100x faster than individual sprites. WebGL only.
const layer = this.add.spriteGPULayer(texture, size); // size = max number of members// Add members (do this all at once, not incrementally):
const member = { x: 100, y: 200, frame: 'tree', scaleX: 1, scaleY: 1, alpha: 1 };
layer.addMember(member);// Reuse the member object for efficiency with millions of entries:
member.x = 300;
member.y = 400;
member.frame = 'bush';
layer.addMember(member);// Enable lighting on the layer:
layer.setLighting(true);
Key details:
- Single texture only (no multi-atlas), single image per layer
- Members support tween-like animations (fade, bounce, wave, color shift) defined at creation
- Updating buffer contents is expensive -- populate once, leave unchanged
- Power-of-two textures recommended for pixel art to avoid seaming
- "Remove" members visually by setting
scaleX/scaleY/alphato 0 (avoids buffer rebuild) - Components: Alpha, BlendMode, Depth, ElapseTimer, Lighting, Mask, RenderNodes, TextureCrop, Visible
Source: src/gameobjects/spritegpulayer/SpriteGPULayer.js
New Components
Full component reference:
game-object-components.md
Lighting Component
Replaces the v3 approach of assigning a lighting pipeline. WebGL only.
// v3 approach:
sprite.setPipeline('Light2D');// v4 approach:
sprite.setLighting(true);// Self-shadowing (simulates surface shadows from texture brightness):
sprite.setSelfShadow(true, 0.5, 1/3);
// Args: enabled, penumbra (lower = sharper), diffuseFlatThreshold (0-1)// Use game-wide default for self-shadow:
sprite.setSelfShadow(null); // reads from config.render.selfShadow
Supported on: BitmapText, Blitter, Graphics, Shape, Image, Sprite, Particles, SpriteGPULayer, Stamp, Text, TileSprite, Video, TilemapLayer, TilemapGPULayer.
Batching note: Lighting changes the shader, which breaks batches. Group lit objects together and unlit objects together for best performance.
Source: src/gameobjects/components/Lighting.js
RenderSteps Component
Allows injecting custom logic into the render process of a game object. WebGL only. The Filters system uses RenderSteps internally.
// Add a custom render step:
gameObject.addRenderStep(function (renderer, gameObject, drawingContext, parentMatrix, renderStep, displayList, displayListIndex) {
// Custom rendering logic here
// Call next step when ready:
var nextFn = gameObject._renderSteps[renderStep + 1];
if (nextFn) {
nextFn(renderer, gameObject, drawingContext, parentMatrix, renderStep + 1, displayList, displayListIndex);
}
});
Key details:
- Steps are stored in
_renderStepsarray, executed viarenderWebGLStep() - First step runs first and is responsible for calling subsequent steps
- This is how Filters defer and control the
renderWebGLflow
Source: src/gameobjects/components/RenderSteps.js
RenderNodes Component
Provides defaultRenderNodes, customRenderNodes, and renderNodeData maps on game objects. See the RenderNodes section above for usage.
Source: src/gameobjects/components/RenderNodes.js
TilemapGPULayer
Full tilemap reference:
tilemaps.md
High-performance GPU-based tilemap rendering. Renders the entire layer as a single quad via a specialized shader. WebGL only.
// Create via Tilemap with the gpu flag:
const map = this.make.tilemap({ key: 'level1' });
const tileset = map.addTilesetImage('tiles', 'tilesImage');
const gpuLayer = map.createLayer('Ground', tileset, 0, 0, true); // last arg: gpu = true
Capabilities:
- Single tileset with single texture image
- Maximum 4096x4096 tiles, up to 2^23 unique tile IDs
- Tile flipping and animation supported
- Orthographic tilemaps only (no isometric/hexagonal)
- Perfect texture filtering in LINEAR mode (no tile seams)
- Cost is per-pixel, not per-tile -- no performance loss with many visible tiles
Restrictions:
- Cannot use multiple tilesets
- Editing requires manual
generateLayerDataTexture()call to update - Orthographic only
Internal data: Tile data stored in a texture (4 bytes/tile: 2 flip bits, 1 animation bit, 1 unused, 28-bit tile index). Animation data in a separate texture.
Source: src/tilemaps/TilemapGPULayer.js
For detailed configuration options, API reference tables, and source file maps, see the reference guide.
Все файлы
0 файловУстановить v4-new-features
Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.
Скачать ZIPКлонируйте репозиторий и скопируйте файлы навыка в свой проект.
git clone https://github.com/phaserjs/phaser/tree/master/skills/v4-new-features # Copy the skill folder to .claude/skills/ or .codex/skills/
Копировать





Дом
