在three.js

时间:2018-02-19 12:50:54

标签: memory three.js

已经有一些主题围绕着三个.js和内存使用情况,但我不知道他们是否已经过时或者我是否仍然缺少某些内容:他们的解决方案并非如此用three.js r90为我工作。

加载所有网格

这是我如何加载对象:

      var loader = new THREE.ObjectLoader();
      var objects = [];

      function loadMesh(path) {

        loader.load(path, function (obj) {

           obj.traverse(function (child) {

              if (child instanceof THREE.Mesh) {
                 child.material.skinning = true;
              }
           });
           scene.add(obj);
           objects.push(obj);
        });
     }
     // ...
     loadMesh('path/to/obj01.json');
     loadMesh('path/to/obj02.json'); 
     loadMesh('...');
     ///...

加载所有网格后,内存增加约1Go。

删除所有网格(和可用内存)

1 - 首先尝试

     function clearAll() {

        var objLen = objects.length;
        for (var i = 0; i < objLen; i++) {
           scene.remove(objects[i]); 
           objects[i] = undefined;
           objects.slice(i, 1);
        } 
     }

调用此功能后,所有网格物体都可以从场景中移除,但在GC循环后内存不会减少。 (我正在使用&#34;关于:内存&#34;在firefox中的页面)

2- 尝试使用dispose()

     function clearAll() {

        for (var i = 0; i < objects.length; i++) {
           scene.remove(objects[i]);
           objects[i].traverse(function (child) {

              if (child instanceof THREE.Mesh) {
                 child.geometry.dispose();
                 child.material.dispose(); 
              }
           });
           objects[i] = undefined;
           objects.slice(i, 1);
        }
        renderer.dispose(); 
     }

GC循环后仍然没有释放内存。

3 - 尝试取消设置渲染器。

在第一次尝试时,我注意到如果我从未使用clearAll()呈现场景,则在我调用renderer.render(scene, camera)时会释放内存。 所以我试图解开它:

     function clearAll() {

        var objLen = objects.length;
        for (var i = 0; i < objLen; i++) {
           scene.remove(objects[i]); 
           objects[i] = undefined;
           objects.slice(i, 1);
        } 
        renderer = undefined;
        initRenderer(); // recreate and configure renderer.
     }

这样GC可以正常释放内存。这让我觉得渲染器中还有一些对网格的引用?当我在网格和渲染器上调用dispose时,为什么他们不会被取消?

修改

4 - 尝试使用Gaitat的解决方案

Three.js Collada - What's the proper way to dispose() and release memory (garbage collection)?

   function clearAll() {

    for (var i = 0; i < objects.length; i++) {
       scene.remove(objects[i]);
       disposeHierarchy (objects[i], disposeNode);
       delete(objects[i]);   
  }

  function disposeNode(){...}
  function disposeHierarchy(){...}

并且没有更多的内存释放。

0 个答案:

没有答案