2015-03-21 3 views
2

В настоящее время я экспериментирую с тэгом.js, который полагается на requestAnimationFrame для выполнения анимаций.requestAnimationFrame реализация рекурсивна?

Вопрос: Не приведет ли следующий код к бесконечной рекурсии перед вращением куба и вызовом функции renderer.render?

function render() { 
    requestAnimationFrame(render); 
    cube.rotation.x += 0.1; 
    cube.rotation.y += 0.1; 
    renderer.render(scene, camera); 
} 
render(); 

код работает, но я стараюсь, чтобы улучшить мое общее понимание JavaScript.

Способ, которым я его вижу, заключается в том, что рендер вызывается как функция обратного вызова. Но означает ли это, что javascript продолжает работать через код в функции до останавливается, чтобы перейти к следующему звонку?

+0

Мое предположение, что раф работает подобно SetTimeout, поэтому он помещает вызов функции в цикл событий. –

+1

Я действительно сделал. Я прочитал несколько руководств, а также документы Mozilla. Я просто борюсь с такими вещами и предпочитаю более удобочитаемый язык. Оба ответа помогли, и они получили свои очки, поэтому я не вижу никаких проблем. За исключением, может быть, факта, что так много людей ищут оправдания, чтобы закрыть поток в эти дни. Помните, что это не только помогает мне, но и другие, которые используют Google, например, stackoverflow. – thelittlegumnut

ответ

2

Это требует только браузер, чтобы позвонить в вашу функцию обратного вызова до следующего цикла рендеринга:

Вы должны вызывать этот метод каждый раз, когда вы будете готовы обновить анимации на экране. Это потребует вызова функции анимации до того, как браузер выполнит следующую перерисовку.

Таким образом, здесь нет рекурсии, и ваша функция продолжит выполнение.

Вы также можете отменить запрос на обратный вызов с помощью cancelAnimationFrame.

Посмотрите here.

-1

После первого вызова render() RequestAnimationFrame будет асинхронно следить за вашей функцией рендеринга, вызывая ее каждые ~ 60 раз в секунду. Ваша функция не рекурсивна, так как Javascript продолжит выполнение кода.

Однако вы должны использовать RequestAnimationFrame только в самом конце вашей функции рендеринга, как последнюю команду вашей функции. Представьте, что у вас большая сцена, с большим количеством анимаций: запрос следующего кадра перед завершением обновления параметров, вероятно, вызовет огромный беспорядок.

Вы также можете использовать SetTimeout обрабатывать анимацию, вызвав метод визуализации с требуемой частотой кадров, например:

var desideredFrameRate = 60; 

window.myRequestAnimationFrame = function(callback) { 

    setTimeout(callback, 1000/desiredFrameRate); 

} 
+1

Большая часть этого ответа неверна. 1) RequestAnimationFrame вызывает только один раз. 2) использование RequestAnimationFrame в начале позволяет плавные анимации (без «беспорядка») 3) с учетом точности и накладных значений setTimeout, последний фрагмент кода - это всего лишь способ потопить анимацию. – GameAlchemist

Смежные вопросы