Ответ 1
Я сделал несколько экспериментов, и я думаю нет ничего плохого в вашем коде. Одна вещь, которую я узнал, заключается в том, что сборщик мусора может не работать точно, когда вы думаете, что это так. На всякий случай, я завернул ваш код в IIFE (хорошая практика, но не обязательно в этом случае), и ожидал, что куча будет очищена, как только функция завершит работу и выйдет за рамки. Но на это потребовалось некоторое время, чтобы очистить:
Итак, я думал, okey, thats not to good, что, если бы я создавал больше объектов в этот промежуток времени, когда сборщик мусора просто задерживался, поэтому я сделал:
.
.
makeExperiment(50);
clean();
makeExperiment(50);
clean();
makeExperiment(50);
clean();
makeExperiment(50);
clean();
makeExperiment(50);
clean();
makeExperiment(50);
clean();
makeExperiment(50);
clean();
makeExperiment(50);
clean();
и вот что произошло:
Кажется, что сборщик мусора выполняет свою работу, и вы правильно их удаляете для этой цели. Тем не менее. Вероятно, вы также используете TREE.js Renderer, и если я правильно его понимаю, Renderer сохраняет ссылки на материалы, геометрию и текстуры. Поэтому, если они не утилизируются правильно, они не будут собираться мусором. THREE.js имеет метод для Geometry
s, Material
и Texture
, называемый .dispose()
, который уведомит Renderer о его удалении. Таким образом, я бы изменил вашу функцию clean()
:
removable_items.forEach(function(v,i) {
v.material.dispose();
v.geometry.dispose();
box.remove(v);
});