Javascript THREE.js webGL垃圾收集
我们有一个应用程序,它使用THREE.js渲染身体网格的3D图像。我们有一个名为MeshViewer的对象,它封装了渲染功能;在初始化方法期间,我们设置Javascript THREE.js webGL垃圾收集,javascript,three.js,webgl,Javascript,Three.js,Webgl,我们有一个应用程序,它使用THREE.js渲染身体网格的3D图像。我们有一个名为MeshViewer的对象,它封装了渲染功能;在初始化方法期间,我们设置 this.renderer = new THREE.WebGLRenderer({ antialias: true, preserveDrawingBuffer: true }) 我们编写了一个脚本来测试this.renderer没有被释放 <script> var count = 0; function loop
this.renderer = new THREE.WebGLRenderer({ antialias: true, preserveDrawingBuffer: true })
我们编写了一个脚本来测试this.renderer没有被释放
<script>
var count = 0;
function loop () {
if (count >= 25) {
return;
}
else {
count++;
var viewer = new MeshViewer(
'mesh_viewer',
's3_assets/textured_mean_scape_female.obj',
[]
);
viewer.cleanup();
setTimeout(function () {
loop();
}, 500);
}
}
loop();
</script>
清理是有效的,从这个意义上说,如果我们不执行清理,我们会得到一个错误,即存在太多的活动WebGL上下文,我们无法再创建了,如果我们进行清理,我们就不会得到那个错误
我的问题是,为什么在setTimeout中循环之前调用viewer.cleanup时失败,而在setTimeout外部和之前调用cleanup时失败?(这可能是一个JavaScript问题,而不是一个THREE.js/WebGL问题。)它可能与
如果你把viewer.cleanup()
在setTimeout
之前,浏览器的内部函数或三个延迟函数都会在调用loop()之前找到时间实际释放渲染器代码>
Elseviewer.cleanup()
和loop()
将连续调用,其间不会有任何其他事件发生
注意:我没有做任何测试来证实这一点
还有一个建议:也许你应该把你的THREE.WebGLRenderer
实例放到一个单例中,重新使用它,而不是释放它。为什么这个问题被否决?有没有控制台错误?也许传递给setTimeout
的函数会捕获查看器及其所有属性,包括渲染器,这意味着渲染器的引用计数永远不会变为0,因此不会被垃圾收集?
this.renderer = null