首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >清理Threejs WebGl上下文

清理Threejs WebGl上下文
EN

Stack Overflow用户
提问于 2014-02-04 17:17:33
回答 3查看 14.5K关注 0票数 24

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

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

在多次切换之后,上下文完全丢失,应用程序崩溃。

有没有办法在清理时销毁当前的WebGl上下文?或者,WebGlRenderer在实例化时总是创建新的WebGl上下文吗?

我正在使用Three.js R64。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-22 00:55:02

可以为不同的场景保留相同的渲染器。渲染器并不关心它将渲染什么场景。如果愿意,您可以在每次调用render()时提供不同的Scene

代码语言:javascript
复制
// 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);
}
票数 12
EN

Stack Overflow用户

发布于 2015-08-17 22:13:11

我也有同样的问题,但由于要求,我不能使用SPA解决它。

对于这种情况,WebGLRenderer (版本71,可能是早期版本)中有.forceContextLoss()方法。

因此,我在“deallocate”方法中的代码类似于

代码语言:javascript
复制
_self.renderer.forceContextLoss();
_self.renderer.context = null;
_self.renderer.domElement = null;
_self.renderer = null;
票数 18
EN

Stack Overflow用户

发布于 2014-06-10 18:35:24

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21548247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档