requestAnimationFrame实现递归?

问题描述 投票:2回答:3

我目前正在尝试使用three.js,它依赖于requestAnimationFrame来执行动画。

问题:在立方体旋转和renderer.render函数调用之前,以下代码不会导致无限递归吗?

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

代码有效,但我正在努力提高我对javascript的整体理解。

我看到它的方式是渲染被调用作为回调函数。但这是否意味着javascript继续运行函数中的代码,然后停止继续下一个调用?

javascript animation requestanimationframe
3个回答
4
投票

这仅请求浏览器在下一个渲染循环之前调用您的回调:

只要您准备好在屏幕上更新动画,就应该调用此方法。这将请求在浏览器执行下一次重绘之前调用您的动画函数。

所以这里没有递归,你的函数继续执行。

您也可以使用cancelAnimationFrame取消回拨请求。

看看here


0
投票

requestanimationframe最简单的用法是一次又一次地调用它,直到没有必要

我在开发一个小型图书馆时学到了这一课

https://github.com/allenhwkim/jsanimation

用法

import {slideInRight} from 'jsanimation';
slideInRight(el);

-1
投票

在第一次render()调用之后,RequestAnimationFrame将异步处理你的渲染函数,每秒约60次调用它。您的函数不是递归的,因为Javascript将继续执行代码。

但是,您应该仅在渲染函数的最后使用RequestAnimationFrame,作为函数的最后一个命令。想象一下,你有一个大场景,有很多动画:在完成参数更新之前请求下一帧,可能会造成巨大的混乱。

您还可以使用setTimeout处理动画,使用所需的帧速率调用render方法,如下所示:

var desideredFrameRate = 60;

window.myRequestAnimationFrame = function(callback) {

    setTimeout(callback, 1000/desiredFrameRate);

}
© www.soinside.com 2019 - 2024. All rights reserved.