Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript THREE.js webGL垃圾收集_Javascript_Three.js_Webgl - Fatal编程技术网

Javascript THREE.js webGL垃圾收集

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

我们有一个应用程序,它使用THREE.js渲染身体网格的3D图像。我们有一个名为MeshViewer的对象,它封装了渲染功能;在初始化方法期间,我们设置

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()之前找到时间实际释放渲染器

Else
viewer.cleanup()
loop()
将连续调用,其间不会有任何其他事件发生

注意:我没有做任何测试来证实这一点



还有一个建议:也许你应该把你的
THREE.WebGLRenderer
实例放到一个单例中,重新使用它,而不是释放它。

为什么这个问题被否决?有没有控制台错误?也许传递给
setTimeout
的函数会捕获查看器及其所有属性,包括渲染器,这意味着渲染器的引用计数永远不会变为0,因此不会被垃圾收集?
this.renderer = null