Подтвердить что ты не робот

Управление тремя js-памятью

У меня большая сцена с большим количеством Mesh и MorphAnimMesh. Я хочу освободить память при удалении сеток. Если я правильно знаю, это лучший способ сделать:

for ( var i = scene.children.length - 1; i >= 0 ; i -- ) {
  var obj = scene.children[i];
  scene.remove(obj);
  obj.deallocate(); 
  obj.geometry.deallocate();
  obj.material.deallocate();
  obj.material.map.deallocate();
}

Если после этого я проверю использование памяти в диспетчере задач, ничего не изменится. (попытался подождать несколько минут для GC, но ничего.) Снимок памяти Google Chrome показывает все еще объекты. morphTargets в THREE.Geometry @1862203 и т.д.

Попробовал установить obj в значение null, но по-прежнему не уменьшается память.

Любая идея, что я делаю неправильно?

Его игра с уровнями и игрок может переходить от одного к другому. После нескольких изменений использование памяти увеличивается до действительно высокого. Вот почему я хочу удалить весь объект из памяти до изменения уровня.

4b9b3361

Ответ 2

Я попробовал все методы dispose и deallocate, но ничего не получилось.

Затем я сделал следующее для моего ионного приложения, которое использует средство отображения webgl, чтобы отобразить 360 изображений.

this.renderer = new THREE.WebGLRenderer({ antialias: true });
RicohView.prototype.stopRendering = function () {
    this.canRender = false;
    this.renderer.forceContextLoss();
    this.renderer.dispose();
    console.log('renderer disposed');
    cancelAnimationFrame(this.requestId);
}

requestId - это то, что можно захватить из

this.requestId = requestAnimationFrame(render);

Ответ 3

Управление памятью JavaScript полностью контролируется браузером. Вы не можете заставить GC работать (и вы не сможете его использовать, так как он довольно хорошо оптимизирован).

GC уничтожит объекты, которые больше не имеют ссылки на них; установка obj = null; фактически не уничтожает объект, а просто удаляет эту ссылку на объект.

Если у вас есть другие ссылки, которые все еще лежат в закрытых закрытых (или прикрепленных DOM) закрытиях, браузер сохранит этот объект живым ради них.

Вы должны прочитать совершенные убийства - понимание удаления, и если вы используете хром, это выглядит как хороший инструмент: средство поиска утечек для javascript