【发布时间】:2014-07-09 08:21:05
【问题描述】:
我正在使用 ThreeJS 处理具有 OrbitControls 的基本 3d 场景。一切都很好,除了它会导致我的整个网站滞后,因为即使用户没有看它,它也会自行循环。我想要一个可以在满足某些条件时调用来启动和停止渲染的函数(在这种情况下,用户没有查看画布)。我有一个可以正常工作的启动功能,但停止功能似乎没有工作,因为我的网站在 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 场景在加载后滞后于我的整个应用程序。这不现实。
【问题讨论】:
-
您的场景似乎是静态的。那是对的吗?如果是这样,您不需要每秒重新渲染 60 次。
-
非常正确,除了控件之外,没有任何动画。出于某种原因,我认为为了让控件顺利运行,它需要以 60fps 的速度渲染。我会解决这个问题并会报告!
-
加
controls.addEventListener( 'change', render ); -
这极大地提高了性能。太感谢了!现在我只需要修改一些东西来隐藏画布或至少在不需要时禁用它的控件。有什么方法可以将您的回复转换为答案,以便我将其选为最佳答案?
标签: javascript three.js lag