Създадох приложение ThreeJS, използвайки рендеринга на платното (поради изискванията на проекта), с който се сблъсках с проблем с паметта/събирането на боклука.
Част от логиката на приложението създава много мрежи за постигане на анимации върху сегменти на плоска 2d поничка/пръстен. При всяко преминаване на анимация ние премахваме всички предишни мрежи и генерираме нови.
Когато обектите се премахнат от сцената, те не се изтриват от паметта, а вместо това се преместват в масив, наречен __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
Благодаря ти!