ThreeJS停止渲染

时间:2014-05-20 21:45:33

标签: javascript three.js lag

我正在使用具有OrbitControls的基本3D场景上使用ThreeJS。一切都很好,除了它导致我的整个网站滞后,因为即使用户没有看它,它也会自行循环。我想要一个函数,我可以调用它来满足某些条件时启动和停止渲染(在这种情况下,用户不会查看画布)。我有一个很好的启动功能,但停止功能似乎没有工作,因为我的网站在ThreeJS初始化后变得无法忍受。

我已经查找并寻找了解决此问题的方案,并找到了几个解决方案,但无论出于何种原因,他们都无法使用我的应用程序。我的假设是这些解决方案来自旧版本的ThreeJS。

这是我在main.js文件中的代码:

var scene, 
    camera, 
    controls,
    render,
    requestId = undefined;


function init() {
    scene = new THREE.Scene();
    var threeJSCanvas = document.getElementById("threeJS");
    camera = new THREE.PerspectiveCamera( 75, threeJSCanvas.width / threeJSCanvas.height, 0.1, 1000 );

    controls = new THREE.OrbitControls( camera );

    // Controls and Camera settings

    // Create Geometry.

}

function render() {
    requestId =  requestAnimationFrame(render);
    renderer.render(scene, camera);

}

function start() {
    render();
}

function stop() {
   window.cancelAnimationFrame(requestId);
   requestId = undefined;


}

在我的其他javascript文件中,我的pageChange函数中有一个条件(这是一个多页面应用程序),如下所示:

if (page == 5) { // The page with the canvas on it
    if (!locationsRendered) {
    init();
    locationsRendered = true;
}
} else { // If the page is not the page with the canvas on it
    if (locationsRendered) {
        stop();
    }
}

locationsRendered早先在本地范围内的第二个javascript文件中初始化。

任何帮助都会非常感激,因为我不能让这个简单的3D场景在加载完整的应用程序后落后。这不太现实。

3 个答案:

答案 0 :(得分:6)

如果您的场景是静态的,则没有理由进行动画循环。您只需在相机因鼠标或触摸事件而移动时重新渲染。

只需使用此模式:

controls = new THREE.OrbitControls( camera, renderer.domElement );

controls.addEventListener( 'change', render );

function render() {

    renderer.render( scene, camera );

}

three.js r.67

答案 1 :(得分:0)

我在场景中使用了轨迹球控件,因此无法使用上述解决方案(因为鼠标事件完成触发后轨迹球控件会继续更新)。

为解决此问题,我使用了:

function animate() {
  renderer.render(scene, camera);
  controls.update();
}
renderer.setAnimationLoop(animate);

这将无限期地运行动画循环。要暂停动画,可以将null指定为动画循环:

renderer.setAnimationLoop(null);        // pause the animation

要恢复动画,只需再次通过动画循环即可:

renderer.setAnimationLoop(animate);     // resume the animation

答案 2 :(得分:0)

完全停止渲染循环的另一种解决方案是降低每秒帧数,从而减少资源消耗。

如果您需要在场景上进行响应性更新而不必设置动画,但又需要在需要时恢复正常速度,则此方法特别有用。

一个简单的setTimout()很好地实现了这一目标。

var fps 10;

function render() {

   //reduce framerate
   setTimeout(()=>{

        requestAnimationFrame(render);

        //must be called to enable rotating
        controls.update();
        renderer.render(scene, camera);


   }, 1000/fps)

};