Recursion 为什么递归WebGL函数不会导致堆栈溢出?
这是我关于StackOverflow的第一个问题,请原谅协议中的任何违规行为 我在大学的计算机图形学课上学习WebGL。在学习在屏幕上旋转正方形时,我和同学们注意到渲染函数中的以下代码:Recursion 为什么递归WebGL函数不会导致堆栈溢出?,recursion,webgl,stack-overflow,Recursion,Webgl,Stack Overflow,这是我关于StackOverflow的第一个问题,请原谅协议中的任何违规行为 我在大学的计算机图形学课上学习WebGL。在学习在屏幕上旋转正方形时,我和同学们注意到渲染函数中的以下代码: function render() { gl.clear(gl.COLOR_BUFFER_BIT); theta += 0.1; gl.uniform1f(thetaLoc, theta); gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); render();
function render()
{
gl.clear(gl.COLOR_BUFFER_BIT);
theta += 0.1;
gl.uniform1f(thetaLoc, theta);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
render();
}
我们不明白的是,我们的教授不能给我们一个充分的答案,为什么这段代码不会导致堆栈溢出,因为它递归地调用自己。我们运行了代码,它没有引起任何问题,但我们不明白为什么
我们无法在教科书或网上找到答案。如果有人能解释,我就把它传给我的同学。提前感谢。这确实会导致堆栈溢出。当我运行它时,我得到
Uncaught RangeError: Maximum call stack size exceeded
我想你可能看到过这样的代码
function render() {
...
requestAnimationFrame(render);
}
render();
在这种情况下,它不是递归的。渲染函数正在请求动画帧,然后退出。然后浏览器再次渲染它调用的下一帧。我从来没有听说过尾部调用优化,但您提供的链接对此进行了完美的解释。我会转告你的。谢谢最有可能的是,您的编译器足够聪明,能够识别优化的机会,但使用另一个编译器可能会溢出—请小心。另一方面,函数式语言严重依赖递归,其中一些语言提供了显式tailrec优化的方法,因此递归不是坏事,但可能很危险。感谢gman确认我没有发疯。但是JAre在评论中为我回答了这个问题,解释了尾部调用优化。很明显,您的浏览器没有这种优化,这导致了堆栈溢出。我感谢你和他帮助我理解这个问题。我认为只有ES6+有尾部呼叫优化。