я использую Angular 9 вместе с ТРИ. Js. Приложение позволяет переключаться между компонентом 2D html и компонентом 3D Three Js нажатием кнопки. 3D компонент создает все необходимое для трех js на ngAfterViewInit
и вызывает функцию al oop с requestAnimationFrame
.
private loop() {
this.AFID = requestAnimationFrame(this.loop.bind(this))
this.renderer.render(this.scene, this.camera)
}
l oop отменяется, как только загружаются все модели моей сцены и срабатывает обратный вызов onLoad или когда ngOnDestroy
.
private stopLoop() {
cancelAnimationFrame(this.AFID)
this.AFID = null
}
This отлично работает при переключении компонентов время от времени, но при нажатии кнопки быстрее или несколько раз подряд, requestAnimationFrame не останавливается и складывается. Я использую stats- js lib для определения частоты кадров, обычно она составляет около 40 кадров в секунду, но она добавляет до 120-220 кадров в секунду или более. Мой компьютер начинает зависать и работать, и все замедляется.
![enter image description here](https://i.stack.imgur.com/FcToD.png)
Обычно это должно быть в 0, потому что, когда все загружено, не должно быть никакого кадра анимации больше!
Как мне избежать такого поведения?
Обновление: Похоже, я нашел проблему. Моя ошибка была в bind
функции l oop, которая генерирует новый экземпляр каждый раз. Хотя у меня есть сомнения, потому что AFID все еще обновляется и поэтому отменяет animationFrame. Но отсутствие привязки дает мне некоторые ошибки неопределенных свойств тут и там