清理 Threejs WebGl 上下文

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

我在清理 WebGl 场景时遇到问题。我将 Three.js 与 WebGlRenderer 一起使用。在我的应用程序中,我必须经常更改视图,因此需要始终渲染新场景。到目前为止,我销毁并重新初始化了整个 Threejs 场景。切换场景大约 15 - 20 次后,我收到以下警告:

WARNING: Too many active WebGL contexts. Oldest context will be lost.

再切换几次后,上下文完全丢失,应用程序崩溃。

清理时有没有办法破坏当前的WebGl上下文?或者 WebGlRenderer 在实例化时总是创建一个新的 WebGl 上下文?

我正在使用 Three.js R64。

three.js webgl renderer resource-cleanup
3个回答
21
投票

我也遇到了同样的问题,但由于要求,我无法使用 SPA 解决它。

对于这种情况,

.forceContextLoss()
(rev 71,可能是早期)有
WebGLRenderer
方法。

所以,我在“解除分配”方法中的代码类似于

this.renderer.forceContextLoss();
this.renderer.context = null;
this.renderer.domElement = null;
this.renderer = null;

14
投票

您可以为不同的场景保留相同的渲染器。渲染器并不关心它将渲染什么场景。如果您愿意,您可以每次致电

Scene
时提供不同的
render()

// instantiate only once and keep it
var renderer = new THREE.WebGLRenderer();

// current scene and camera. Switch whenever you like
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(...);
fillScene(scene);

// rendering always uses current scene
function render() {
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

/* ... 
 *   somewhere in your application
 * ...
 */
if(condition) {
  // switch scene
  scene = new THREE.Scene();
  fillOtherScene(scene);
}

3
投票

您应该只创建和使用一个 WebGlRenderer。在我的 SPA(单页应用程序)中,经过几次重定向后,THREE.js 中的相机/场景出现了奇怪的问题。这是因为每次渲染一个特定页面时都会创建 WebGlRenderer。控制台日志中没有错误(只有您编写的警告)。 错误表现为相机位置的变化和渲染问题。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.