在我目前的项目中,我使用Threejs构建一个带网格的关卡。所有带摄像头,场景,投影仪,渲染器等的图形内容都在一个对象中完成。出于测试目的,我想用不同的参数重置整个场景,例如不同的级别大小。
因为我想要一个算法的测量时间,我想要一个“完全”的重置。所以我目前的方法是删除包含场景/画布的div框并删除包含threejs代码的整个对象。在此之后,我为图形级别实例化一个新对象。不幸的是,连续10次这样做会导致性能大幅下降。
我还尝试使用scene.delete()删除场景中的所有网格,并在删除整个对象之前删除诸如场景,渲染器等内容。但仍然是性能问题。
那么如何在不降低性能的情况下实现所有图形webgl组件的完全重置?
提前致谢。
答案 0 :(得分:4)
删除与三个相关的所有操作都无法解决问题,因为即使删除了WebGLRenderer,它也永远不会释放它的WebGL上下文,因此您最终会同时运行多个WebGL上下文。每个额外的实时上下文的性能都会降低。最终会受到限制。
请参阅this question了解发布上下文的黑客方式。
three.js不支持释放上下文,因为您实际上不需要重新创建上下文。在我的例子中,使用Angular和多个应用程序阶段,其中一些使用WebGL而另一些则不使用,我只是在页面级控制器中保留渲染器的实例,这样我就可以在子控制器中访问它,因此永远不需要重新创建WebGLRenderer也不是,因此,上下文。
答案 1 :(得分:1)
可能会提高效果重置效果的两个功能:对于场景中的每个对象obj
,请同时尝试:
scene.remove( obj );
renderer.deallocateObject( obj );