Я создал приложение ThreeJS, используя средство визуализации холста (из-за требований проекта), с которым я столкнулся с проблемой памяти/сборки мусора.
Часть логики приложения создает множество сеток для достижения анимации на сегментах плоского двумерного пончика/кольца. При каждом проходе анимации мы удаляем все предыдущие сетки и создаем новые.
Когда объекты удаляются со сцены, они не удаляются из памяти, а перемещаются в массив с именем __objectsRemoved. Это сохраняется на неопределенный срок - я полагаю, что есть какая-то сборка мусора, которая в конечном итоге все очищает, но я не знаю, как это вызвать. Использование памяти приложением постоянно растет, пока оно не остановит браузер в течение 30-40 секунд.
Мы не смогли решить эту проблему и отчаянно ищем совета. Этот проект должен быть запущен очень скоро, поэтому мы будем очень признательны за любые немедленные рекомендации/советы.
Вот скрипка, которая иллюстрирует проблему. http://jsfiddle.net/729sv/
var camera, scene, renderer;
var base = 0;
init();
animate();
function init() {
renderer = new THREE.CanvasRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.z = 100;
document.addEventListener('mousedown', update, false);
update();
}
function update() {
if (base) scene.remove(base);
base = new THREE.Object3D();
scene.add(base);
for (var j = 0; j < 10; ++j) {
var geometry = new THREE.IcosahedronGeometry(50, 3);
var material = new THREE.MeshNormalMaterial()
var mesh = new THREE.Mesh(geometry, material);
base.add(mesh);
}
}
function animate() {
requestAnimationFrame(animate);
console.log(scene.__objectsRemoved.length);
renderer.render(scene, camera);
}
Мы используем ThreeJS R62.
Спасибо!