В графических приложениях на базе PixiJS значительная часть производительности зависит от того, как загружаются, хранятся и повторно используются ресурсы: текстуры, атласы, шрифты, видео и другие данные. Неправильная работа с ними приводит к избыточному потреблению памяти, дублированию объектов в GPU и падению FPS.
В PixiJS реализована встроенная система кеширования, позволяющая:
Основой кеширования являются три ключевые структуры:
Модуль Assets управляет загрузкой, хранением и повторным
использованием ресурсов.
import { Assets } from 'pixi.js';
await Assets.load('images/player.png');
const texture = Assets.get('images/player.png');
При повторном вызове Assets.load() с тем же URL
повторная загрузка не происходит — используется кешированная версия.
BaseTexture.Texture.Это предотвращает повторное создание GPU-ресурсов.
BaseTexture представляет физический ресурс в памяти
видеокарты. Если один и тот же файл используется несколькими спрайтами,
в памяти хранится только одна BaseTexture.
Texture — это область внутри BaseTexture.
Например, в случае атласа:
BaseTexture — весь файл атласа,Texture — отдельный фрагмент внутри него.Повторное использование текстур:
import { Texture, Sprite } from 'pixi.js';
const texture = Texture.from('images/enemy.png');
const enemy1 = new Sprite(texture);
const enemy2 = new Sprite(texture);
Оба спрайта используют один и тот же GPU-ресурс.
Метод Texture.from() автоматически использует глобальный
кеш:
const texture1 = Texture.from('images/tree.png');
const texture2 = Texture.from('images/tree.png');
console.log(texture1 === texture2); // true
Повторное создание текстуры не создаёт новый объект, если он уже существует в кеше.
Для игровых приложений рекомендуется использовать текстурные атласы. Они уменьшают количество draw call и ускоряют рендеринг.
Пример загрузки атласа:
await Assets.load('atlas/game.json');
const heroTexture = Texture.from('hero_idle.png');
После загрузки JSON-файла атласа:
BaseTexture;Texture;Для освобождения памяти используется метод:
await Assets.unload('images/player.png');
Удаляются:
BaseTexture;Важно учитывать, что если текстура используется активными объектами сцены, удаление приведёт к ошибкам рендеринга.
texture.destroy(true);
Параметр true означает удаление связанного
BaseTexture. Это необходимо, если больше ни один объект его
не использует.
Кеширование ресурсов тесно связано с повторным использованием объектов сцены.
В игровых сценах (пули, частицы, враги) создание и удаление спрайтов каждую секунду приводит к:
Используется пул объектов:
const pool = [];
function getBullet(texture) {
let bullet = pool.pop();
if (!bullet) {
bullet = new Sprite(texture);
}
bullet.visible = true;
return bullet;
}
function releaseBullet(bullet) {
bullet.visible = false;
pool.push(bullet);
}
Объекты не уничтожаются — они переиспользуются.
PixiJS позволяет кешировать отображение сложного контейнера в виде текстуры.
container.cacheAsBitmap = true;
При этом:
Подходит для:
После изменения содержимого необходимо сбросить кеш:
container.cacheAsBitmap = false;
container.cacheAsBitmap = true;
RenderTexture позволяет вручную сохранять результат
рендеринга в текстуру.
import { RenderTexture } from 'pixi.js';
const renderTexture = RenderTexture.create({
width: 800,
height: 600
});
app.renderer.render(container, { renderTexture });
Это позволяет:
Текст в PixiJS может быть дорогим по производительности, особенно при частом обновлении.
Использование Bitmap-шрифтов существенно снижает нагрузку:
import { BitmapText } from 'pixi.js';
const score = new BitmapText('100', {
fontName: 'ArcadeFont'
});
Глифы заранее загружены и используются как текстуры.
Рациональное кеширование требует:
Типичная структура:
async function loadLevel() {
await Assets.load([
'images/background.png',
'atlas/level1.json'
]);
}
async function unloadLevel() {
await Assets.unload([
'images/background.png',
'atlas/level1.json'
]);
}
Такой подход предотвращает утечки памяти.
Каждая уникальная текстура — это потенциальный новый draw call.
Один атлас вместо десятков отдельных PNG-файлов.
Предпочитать скрытие и переиспользование.
Слишком большие изображения увеличивают потребление видеопамяти.
Особенно важно в мобильных браузерах.
destroy.cacheAsBitmap для часто изменяемых
объектов.Texture.from.Такой подход обеспечивает:
Грамотное кеширование и повторное использование — фундамент производительных приложений на PixiJS.