В PixiJS управление ресурсами играет ключевую роль в поддержании производительности и предотвращении утечек памяти. Особенно важно правильно уничтожать текстуры и связанные с ними объекты после того, как они перестали быть нужны, поскольку графические ресурсы занимают значительное место в GPU и оперативной памяти.
Текстура (Texture) в PixiJS — это объект,
представляющий изображение, которое может быть отрисовано с помощью
спрайта (Sprite) или другого графического объекта. При
загрузке изображений через PIXI.Loader создаются текстуры,
которые остаются в памяти, даже если все спрайты, их использующие,
удалены.
Спрайт (Sprite) — это объект визуального представления текстуры на сцене. Уничтожение спрайта не автоматически очищает текстуру, на которой он основан.
destroy(options)Метод destroy применяется как к текстурам, так и к
спрайтам. Для текстур ключевое значение имеют следующие опции:
texture.destroy({ baseTexture: true });
true, уничтожается
базовая текстура (BaseTexture), освобождая GPU-память.baseTexture.const texture = PIXI.Texture.from('image.png');
const sprite = new PIXI.Sprite(texture);
// После использования
sprite.destroy(); // удаляет спрайт, но текстура остаётся
texture.destroy(true); // уничтожает текстуру и базовую текстуру
Важно помнить: если текстура используется в нескольких спрайтах, её уничтожение должно происходить только после того, как все объекты перестали ссылаться на неё.
BaseTextureКаждая текстура содержит ссылку на BaseTexture, который хранит данные изображения и управляет ресурсами GPU. Уничтожение текстуры без очистки BaseTexture освободит объект в JS, но текстура в GPU останется, что приведет к росту потребления видеопамяти.
texture.baseTexture.destroy();
Использование baseTexture.destroy() напрямую — более
низкоуровневый способ, который освобождает GPU-ресурсы без уничтожения
объекта Texture в JS.
Loader автоматически создаёт текстуры для загруженных ресурсов. После завершения сцены или уровня необходимо освобождать их:
PIXI.Loader.shared.add('sprite', 'sprite.png').load((loader, resources) => {
const sprite = new PIXI.Sprite(resources.sprite.texture);
// ... использование sprite
// Уничтожение после использования
sprite.destroy();
resources.sprite.texture.destroy(true); // освобождение BaseTexture
});
Для больших проектов рекомендуется хранить список всех используемых текстур и освобождать их централизованно при завершении уровня или сцены.
Контейнеры (Container) могут содержать спрайты и другие
контейнеры. Метод destroy у контейнера имеет опцию
children:
container.destroy({ children: true, texture: true, baseTexture: true });
Это позволяет безопасно удалить целые сцены или слои графики с минимальным риском утечек.
const renderTexture = PIXI.RenderTexture.create({ width: 256, height: 256 });
// ... отрисовка в renderTexture
renderTexture.destroy(true);
Это особенно полезно для частой перерисовки сцен, частиц или динамических объектов.
destroy(true) нельзя применять к текстуре, которая все
еще используется. Иначе возникает визуальный сбой на спрайтах.Управление текстурами и памятью в PixiJS требует дисциплины и внимательности. Систематическое уничтожение спрайтов, текстур и базовых текстур позволяет поддерживать стабильную производительность даже в проектах с большим количеством графических ресурсов.