已经有一些主题围绕着三个.js和内存使用情况,但我不知道他们是否已经过时或者我是否仍然缺少某些内容:他们的解决方案并非如此用three.js r90为我工作。
加载所有网格
这是我如何加载对象:
var loader = new THREE.ObjectLoader();
var objects = [];
function loadMesh(path) {
loader.load(path, function (obj) {
obj.traverse(function (child) {
if (child instanceof THREE.Mesh) {
child.material.skinning = true;
}
});
scene.add(obj);
objects.push(obj);
});
}
// ...
loadMesh('path/to/obj01.json');
loadMesh('path/to/obj02.json');
loadMesh('...');
///...
加载所有网格后,内存增加约1Go。
删除所有网格(和可用内存)
1 - 首先尝试
function clearAll() {
var objLen = objects.length;
for (var i = 0; i < objLen; i++) {
scene.remove(objects[i]);
objects[i] = undefined;
objects.slice(i, 1);
}
}
调用此功能后,所有网格物体都可以从场景中移除,但在GC循环后内存不会减少。 (我正在使用&#34;关于:内存&#34;在firefox中的页面)
2- 尝试使用dispose()
function clearAll() {
for (var i = 0; i < objects.length; i++) {
scene.remove(objects[i]);
objects[i].traverse(function (child) {
if (child instanceof THREE.Mesh) {
child.geometry.dispose();
child.material.dispose();
}
});
objects[i] = undefined;
objects.slice(i, 1);
}
renderer.dispose();
}
GC循环后仍然没有释放内存。
3 - 尝试取消设置渲染器。
在第一次尝试时,我注意到如果我从未使用clearAll()
呈现场景,则在我调用renderer.render(scene, camera)
时会释放内存。
所以我试图解开它:
function clearAll() {
var objLen = objects.length;
for (var i = 0; i < objLen; i++) {
scene.remove(objects[i]);
objects[i] = undefined;
objects.slice(i, 1);
}
renderer = undefined;
initRenderer(); // recreate and configure renderer.
}
这样GC可以正常释放内存。这让我觉得渲染器中还有一些对网格的引用?当我在网格和渲染器上调用dispose时,为什么他们不会被取消?
修改
4 - 尝试使用Gaitat的解决方案:
Three.js Collada - What's the proper way to dispose() and release memory (garbage collection)?
function clearAll() {
for (var i = 0; i < objects.length; i++) {
scene.remove(objects[i]);
disposeHierarchy (objects[i], disposeNode);
delete(objects[i]);
}
function disposeNode(){...}
function disposeHierarchy(){...}
并且没有更多的内存释放。