В библиотеке PixiJS параметр filterArea
используется для управления областью применения фильтров к контейнерам и
спрайтам. Он задаёт прямоугольную область, в пределах которой происходит
визуальная обработка содержимого. Правильное использование
filterArea позволяет оптимизировать
производительность и избежать артефактов
фильтров.
filterArea определяет область в координатах
родительского контейнера, где будет применяться фильтр. Это особенно
важно для фильтров, создающих размытие, свечения или другие эффекты,
которые могут “вылезать” за пределы исходного объекта. Без задания
filterArea фильтр по умолчанию применяется ко всему
содержимому контейнера, что может быть неоптимально.
Пример структуры объекта:
const container = new PIXI.Container();
container.filters = [new PIXI.filters.BlurFilter()];
container.filterArea = new PIXI.Rectangle(0, 0, 800, 600);
В данном случае фильтр размытия будет применяться только внутри
прямоугольника 800x600, начинающегося с координат (0,0)
контейнера.
Установка filterArea может значительно снизить
нагрузку на GPU, так как PixiJS рендерит фильтруемый контент
только в указанной области. Если фильтры применяются к большим
контейнерам или сценам с множеством спрайтов, отсутствие ограничения
области приводит к перерасходу видеопамяти и увеличению времени
отрисовки.
Примеры оптимизации:
const blurFilter = new PIXI.filters.BlurFilter();
container.filters = [blurFilter];
container.filterArea = new PIXI.Rectangle(100, 100, 400, 300);
Только область 400x300 пикселей, смещённая на 100 по X и Y, будет размытой, остальные элементы останутся нетронутыми.
Для анимационных объектов filterArea можно обновлять
каждый кадр:
app.ticker.add(() => {
container.filterArea = new PIXI.Rectangle(
movingSprite.x - 50,
movingSprite.y - 50,
movingSprite.width + 100,
movingSprite.height + 100
);
});
Так фильтр применяется только вокруг движущегося объекта, не затрагивая весь контейнер.
filterArea принимает объект типа
PIXI.Rectangle, который описывается следующими
свойствами:
x — смещение по оси X относительно родителя.y — смещение по оси Y относительно родителя.width — ширина области фильтрации.height — высота области фильтрации.Важно учитывать, что координаты не глобальные, а
относительные к контейнеру, на котором установлен
фильтр. Если контейнер находится внутри других контейнеров с
трансформациями, filterArea не учитывает эти трансформации
автоматически.
Если контейнер имеет маску (mask) или заданные границы
(bounds), фильтр будет применяться только в пределах
filterArea, независимо от маски. Это позволяет создавать
эффекты с точечным выделением:
const glowFilter = new PIXI.filters.GlowFilter();
container.filters = [glowFilter];
container.filterArea = new PIXI.Rectangle(50, 50, 200, 200);
Даже если контейнер полностью выходит за пределы 200x200, фильтр сработает только внутри указанного прямоугольника.
Не задан filterArea для больших
контейнеров Все содержимое контейнера будет фильтроваться, что
приводит к падению FPS.
Использование filterArea с нулевыми
размерами Фильтр не будет видим, так как область равна
(0,0,0,0).
Игнорирование локальных координат Прямоугольник задаётся относительно контейнера, а не сцены. Ошибка в координатах приведёт к смещению фильтруемого эффекта.
filterArea можно задать один раз при создании.filterArea действует одинаково на все фильтры, что удобно
для синхронного эффекта.autoResizePixiJS автоматически не изменяет filterArea при
изменении размеров контейнера. Для динамически изменяемых объектов можно
использовать:
container.filterArea = container.getLocalBounds();
Метод getLocalBounds() возвращает текущие границы
контейнера с учётом всех дочерних элементов, что обеспечивает корректное
применение фильтра без ручного расчёта размеров.
filterArea является ключевым инструментом для
точного контроля и оптимизации фильтров в PixiJS. Он
позволяет:
Правильное использование filterArea совместно с методами
getLocalBounds() и динамическим обновлением обеспечивает
эффективную и точную визуальную обработку объектов в
любых сценах PixiJS.