我在清理WebGl场景时遇到了一个问题。我正在使用带有WebGlRenderer的Three.js。在我的应用程序中,我必须经常更改视图,因此需要一直渲染新的场景。直到现在,我销毁并重新初始化了整个Threejs场景。在切换场景大约15 - 20次后,我得到以下警告:
WARNING: Too many active WebGL contexts. Oldest context will be lost.
在多次切换之后,上下文完全丢失,应用程序崩溃。
有没有办法在清理时销毁当前的WebGl上下文?或者,WebGlRenderer在实例化时总是创建新的WebGl上下文吗?
我正在使用Three.js R64。
发布于 2014-04-22 00:55:02
可以为不同的场景保留相同的渲染器。渲染器并不关心它将渲染什么场景。如果愿意,您可以在每次调用render()
时提供不同的Scene
。
// 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);
}
发布于 2015-08-17 22:13:11
我也有同样的问题,但由于要求,我不能使用SPA解决它。
对于这种情况,WebGLRenderer (版本71,可能是早期版本)中有.forceContextLoss()方法。
因此,我在“deallocate”方法中的代码类似于
_self.renderer.forceContextLoss();
_self.renderer.context = null;
_self.renderer.domElement = null;
_self.renderer = null;
发布于 2014-06-10 18:35:24
您应该只创建和使用一个WebGlRenderer。在我的SPA (单页应用程序)中,在几次重定向之后,我在THREE.js中遇到了奇怪的摄像头/场景问题。这是因为每次呈现一个特定的页面时都会创建WebGlRenderer。控制台日志中没有错误(只有您写的警告)。错误出现在相机位置的变化和渲染问题上。
https://stackoverflow.com/questions/21548247
复制相似问题