PixiJS предоставляет высокоуровневый рендеринг через объект
PIXI.Application, который обычно управляет
циклом отрисовки автоматически. Однако в ряде случаев требуется полный
контроль над рендерингом сцены. Для этого используется ручной
вызов рендеринга через метод
renderer.render().
const app = new PIXI.Application({ width: 800, height: 600 });
document.body.appendChild(app.view);
// Создание контейнера
const stage = new PIXI.Container();
// Создание графического объекта
const graphics = new PIXI.Graphics();
graphics.beginFill(0xff0000);
graphics.drawCircle(100, 100, 50);
graphics.endFill();
stage.addChild(graphics);
// Ручной рендеринг сцены
app.renderer.render(stage);
В примере выше
app.renderer.render(stage) отрисовывает
контейнер stage один раз, независимо от автоматического
цикла, который запускает app.ticker.
По умолчанию PIXI.Application использует
ticker, который вызывает метод
render() каждый кадр. При ручном рендеринге:
render() только при необходимости.Это особенно полезно для:
Метод renderer.render() может
использоваться не только для корневого контейнера, но и для любых
дочерних объектов сцены. Это позволяет рендерить отдельные элементы на
временных канвасах или текстурах.
const renderTexture = PIXI.RenderTexture.create({ width: 200, height: 200 });
app.renderer.render(stage, { renderTexture: renderTexture });
// Создание спрайта из текстуры
const sprite = new PIXI.Sprite(renderTexture);
app.stage.addChild(sprite);
В данном примере stage рендерится в текстуру, а затем
создается спрайт на основе этой текстуры. Такой подход используется для
кэширования сложной графики и уменьшения нагрузки на
GPU.
PixiJS отрисовывает объекты в порядке добавления в контейнер. При ручном рендеринге важно учитывать:
container.children.sort() позволяет изменять порядок
отрисовки без удаления объектов.stage.children.sort((a, b) => a.zIndex - b.zIndex);
Для корректной работы сортировки объекты должны иметь свойство
zIndex и
container.sortableChildren = true.
Ручной рендеринг хорошо сочетается с анимацией без использования
ticker. Можно использовать
requestAnimationFrame:
function animate() {
graphics.rotation += 0.01;
app.renderer.render(stage);
requestAnimationFrame(animate);
}
animate();
Такой подход позволяет:
Для сложных проектов может потребоваться рендерить несколько сцен на
одном канвасе или на разных канвасах. Прямое использование
renderer.render() позволяет:
const scene1 = new PIXI.Container();
const scene2 = new PIXI.Container();
app.renderer.render(scene1);
app.renderer.render(scene2);
При ручном рендеринге важно учитывать:
render() — каждый
вызов инициирует перерисовку GPU.RenderTexture.dirty-флагов для
изменения объектов только при необходимости.Ручной вызов рендеринга в PixiJS предоставляет полный контроль над отрисовкой сцен, позволяет оптимизировать производительность, работать с текстурами и отдельными контейнерами. Он незаменим в случаях нестандартного цикла анимации, сложных слоев и кэширования графики.
Ключевые методы и свойства:
renderer.render(container[, options])
— основной метод для рендеринга.RenderTexture.create() — создание
текстур для рендеринга в них.container.sortableChildren и
zIndex — управление порядком объектов.requestAnimationFrame — кастомное
управление циклом анимации.Этот подход формирует основу продвинутой работы с PixiJS и обеспечивает гибкость при построении интерактивных и графически сложных приложений.