Two.js предоставляет возможность работы с различными типами рендереров: SVG, Canvas и WebGL. Смешанный рендеринг позволяет комбинировать эти подходы для достижения максимальной производительности и гибкости визуализации. Это особенно важно при сложных сценах, где необходимо сочетание векторной графики и аппаратного ускорения.
Two.js поддерживает выбор рендерера при создании экземпляра:
const params = {
width: 800,
height: 600,
type: Two.Types.webgl // Можно заменить на Two.Types.canvas или Two.Types.svg
};
const two = new Two(params).appendTo(document.body);
Для смешанного рендеринга можно создавать несколько экземпляров
Two, каждый из которых отвечает за свой тип визуализации, и
накладывать их один на другой через CSS или DOM-структуру. Например:
const twoCanvas = new Two({ type: Two.Types.canvas }).appendTo('#canvasLayer');
const twoSVG = new Two({ type: Two.Types.svg }).appendTo('#svgLayer');
Такой подход позволяет распределить нагрузку: динамические объекты рендерятся через Canvas/WebGL, статичные элементы через SVG для лучшей масштабируемости.
SVG обеспечивает высокое качество при масштабировании и возможность взаимодействия с DOM-элементами. Canvas и WebGL лучше подходят для анимации с большим количеством объектов. Смешанный подход:
Пример наложения слоёв:
<div style="position: relative; width: 800px; height: 600px;">
<div id="svgLayer" style="position: absolute; top: 0; left: 0;"></div>
<div id="canvasLayer" style="position: absolute; top: 0; left: 0;"></div>
</div>
Two.js оперирует объектами Group и Shape,
что позволяет структурировать сцену независимо от рендерера. Для
синхронизации между рендерерами используется единая система координат и
таймер:
const group = twoCanvas.makeGroup();
const circle = twoCanvas.makeCircle(100, 100, 50);
group.add(circle);
const svgCircle = twoSVG.makeCircle(100, 100, 50);
Для анимации используется метод two.update() или
встроенные события:
twoCanvas.bind('update', function(frameCount) {
circle.rotation += 0.02;
}).play();
twoSVG.bind('update', function(frameCount) {
svgCircle.rotation += 0.02;
}).play();
Так обеспечивается синхронная анимация элементов на разных слоях.
WebGL рендерер обеспечивает аппаратное ускорение и позволяет обрабатывать сотни тысяч объектов в реальном времени. При смешанном рендеринге можно выделять сложные анимационные слои на WebGL, а простые элементы оставлять на Canvas или SVG.
const twoWebGL = new Two({ type: Two.Types.webgl }).appendTo('#webglLayer');
const particle = twoWebGL.makeCircle(Math.random() * 800, Math.random() * 600, 5);
particle.fill = 'red';
particle.noStroke();
WebGL позволяет использовать прозрачность и эффекты смешивания, что дает реалистичные визуальные эффекты без потери производительности.
SVG слои легко интегрируются с DOM-событиями, что упрощает обработку кликов, перетаскивания и hover-эффектов. Canvas и WebGL требуют дополнительной логики для обработки событий, поэтому часто комбинируются с прозрачными SVG-слоями для интерактивности.
svgCircle._renderer.elem.addEventListener('click', () => {
console.log('SVG элемент нажат');
});
Group) позволяет управлять целыми
слоями объектов одновременно.Смешанный рендеринг в Two.js сочетает векторную точность SVG с производительностью Canvas/WebGL. С правильной структурой сцены, использованием слоёв и групп можно создавать сложные анимации и интерактивные интерфейсы без потери качества и производительности.