4

在我当前的项目中,我使用 Threejs 构建一个带有网格的关卡。相机、场景、投影仪、渲染器等的所有图形内容都在一个对象中完成。出于测试目的,我想用不同的参数重置整个场景,例如不同的关卡大小。

因为我想要测量算法的时间,所以我想要“完全”重置。所以我目前的方法是删除包含场景/画布的 div 框并删除具有threejs代码的整个对象。在此之后,我为图形级别实例化一个新对象。不幸的是,连续 10 次这样做会导致性能大幅下降。

我还尝试使用 scene.delete() 删除场景中的所有网格,并在删除整个对象之前删除场景、渲染器等内容。但仍然存在性能问题。

那么如何在不损失性能的情况下实现所有图形 webgl 组件的整体重置呢?

提前致谢。

4

2 回答 2

4

删除与三个有关的所有内容并不能解决问题,因为即使您的 WebGLRenderer 被删除,它也不会释放它的 WebGL 上下文,因此您最终会同时运行多个 WebGL 上下文。每增加一个实时上下文,性能都会下降。最终,将达到一个限制。

有关释放上下文的黑客方法,请参阅此问题

three.js 不支持释放上下文,因为您确实不需要重新创建上下文。在我的例子中,使用 Angular 和多个应用程序阶段,其中一些使用 WebGL,一些不使用,我只是在页面级控制器中保留一个渲染器实例,这样我就可以在子控制器中访问它,因此永远不需要重新创建WebGLRenderer 也不是上下文。

于 2014-03-18T19:10:14.300 回答
1

可能会提高性能重置的两个功能:对于obj场景中的每个对象,请同时尝试:

scene.remove( obj );
renderer.deallocateObject( obj );
于 2012-08-08T00:04:48.187 回答