Как я правильно распоряжаюсь сценой Three.js? (R55)

Похоже, что у Three.js нет хорошего способа распорядиться THREE.Scene и всеми объектами в этой сцене.

В настоящее время я делаю следующее:

  $.each(scene.__objects, function(idx, obj) {                               
    scene.remove(obj);                                                                                     
    if (obj.geometry) {                                                                                    
      obj.geometry.dispose();                                                                              
    }                                                                                                      
    if (obj.material) {                                                                                    
      if (obj.material instanceof THREE.MeshFaceMaterial) {                 
        $.each(obj.material.materials, function(idx, obj) {                 
          obj.dispose();                                                                                   
        });                                                                                                
      } else {                                                                                             
        obj.material.dispose();                                                                            
      }                                                                                                    
    }                                                                                                      
    if (obj.dispose) {                                                                                     
      obj.dispose();                                                                                       
    }                                                                                                      
  });             

Глядя на профилировщик Chrome Heap, есть еще много объектов, которые не очищаются (Текстуры, шейдерные материалы, векторы и т.д.).

Ответ 1

Я согласен с arriu в том, что должен быть более чистый и общий способ избавиться от памяти в three.js, возможно, начиная со сцены node и пройдя весь путь вниз. Я также думаю, что его общая функция выше должна быть расширена, чтобы обрабатывать больше типов распределения памяти. Рассматривая пример webgl_test_memory.html, он делает что-то очень специфичное для примера и освобождает память сразу после ее выделения. Глядя на webgl_test_memory2.html, этот пример также делает что-то очень конкретное, добавляя сетки в массив, а затем просматривая и удаляя элементы массива. Этот метод не может обрабатывать много распределений памяти, которые были сделаны в вызовах функций. Я не говорю, что два примера не освобождают память. Я думаю, что сцена node должна иметь способ освободить всю память под ней.