В A-Frame каждый компонент может использовать метод
tick, который вызывается на каждом кадре рендеринга. Этот
метод подходит для анимаций, обработки логики движения, взаимодействий с
объектами и других задач, требующих постоянного обновления. Однако
активный tick для всех компонентов без исключения может
приводить к значительным нагрузкам на производительность, особенно в
сложных сценах с большим количеством объектов. Поэтому важно уметь
отключать tick для неактивных
компонентов.
tick в компонентахМетод tick объявляется внутри компонента как функция,
принимающая два параметра:
AFRAME.registerComponent('example-component', {
tick: function (time, deltaTime) {
// Логика обновления на каждом кадре
}
});
time — текущее время сцены в миллисекундах.deltaTime — время, прошедшее с предыдущего кадра,
используется для плавной анимации независимо от FPS.Если компонент временно не нужен для активного обновления,
продолжение вызова tick приводит к лишним вычислениям.
tick у компонентаtick через update
или состояние компонентаКомпонент может хранить внутреннее состояние active и
проверять его внутри tick:
AFRAME.registerComponent('optimized-component', {
schema: { active: { type: 'boolean', default: true } },
tick: function (time, deltaTime) {
if (!this.data.active) return;
// Основная логика только когда компонент активен
}
});
Этот способ прост в реализации, но метод tick всё равно
вызывается на каждом кадре, что не полностью экономит ресурсы.
tick
методаМожно полностью исключить компонент из цикла tick,
изменяя его методы во время выполнения:
AFRAME.registerComponent('dynamic-tick', {
init: function () {
this.activeTick = this.activeTick.bind(this);
},
play: function () {
this.el.tick = this.activeTick;
},
pause: function () {
delete this.el.tick;
},
activeTick: function (time, deltaTime) {
// Логика обновления
}
});
play() вызывается автоматически при активации
компонента (el.setAttribute('component', 'play', true) или
при добавлении компонента к элементу).pause() отключает метод tick, экономя
ресурсы.tickВ сложных проектах рекомендуется создавать системы, которые управляют группой компонентов:
AFRAME.registerSystem('tick-manager', {
init: function () {
this.activeComponents = [];
},
register: function (component) {
this.activeComponents.push(component);
},
unregister: function (component) {
this.activeComponents = this.activeComponents.filter(c => c !== component);
},
tick: function (time, deltaTime) {
this.activeComponents.forEach(c => c.customTick(time, deltaTime));
}
});
AFRAME.registerComponent('managed-component', {
init: function () {
this.el.sceneEl.systems['tick-manager'].register(this);
},
remove: function () {
this.el.sceneEl.systems['tick-manager'].unregister(this);
},
customTick: function (time, deltaTime) {
// Логика обновления
}
});
Преимущества такого подхода:
tick.tick только для одного объекта системы, а не для каждого
компонента отдельно.tick для объектов вне видимости
камеры — использовать события mouseenter,
mouseleave или visible для
активации/деактивации обновлений.tick можно использовать
setInterval внутри компонента с нужным интервалом.tick.tick через атрибуты
элемента в HTML.Эффективное отключение tick у неактивных компонентов
напрямую влияет на производительность и плавность сцены. Для мелких
компонентов достаточно проверки состояния внутри tick, для
динамических объектов — удаление метода, для больших сцен —
централизованное управление через системы. Комбинирование этих подходов
позволяет оптимизировать работу A-Frame даже при сотнях или тысячах
объектов на сцене.