Clearing the scene and engine - is this overkill?

If I want to clear EVERYTHING to free up all the memory consumed by BabylonJS (forgetting about Chrome’s poor memory management at least…), is it enough to simply call:

engine.dispose();
engine = null;

Or should I try to manually dispose and set all lights/cameras/materials/meshes to null?

Right now I am using this code, and wondering if it is overkill:

for (let i = 0; i < this._scene.cameras.length; i++) {
	if (this._scene.cameras[i] && !this._scene.cameras[i].isDisposed()) {
		this._scene.cameras[i].dispose(false, true);
		this._scene.cameras[i] = null;
	}
}
for (let i = 0; i < this._scene.lights.length; i++) {
	if (this._scene.lights[i] && !this._scene.lights[i].isDisposed()) {
		this._scene.lights[i].dispose(false, true);
		this._scene.lights[i] = null;
	}
}
for (let i = 0; i < this._scene.materials.length; i++) {
	if (this._scene.materials[i]) {
		this._scene.materials[i].dispose();
		this._scene.materials[i] = null;
	}
}
for (let i = 0; i < this._scene.meshes.length; i++) {
	if (this._scene.meshes[i] && !this._scene.meshes[i].isDisposed()) {
		this._scene.meshes[i].dispose(false, true);
		this._scene.meshes[i] = null;
	}
}
for (let i = 0; i < this._scene.spriteManagers.length; i++) {
	if (this._scene.spriteManagers[i]) {
		this._scene.spriteManagers[i].dispose();
		this._scene.spriteManagers[i] = null;
	}
}
for (let i = 0; i < this._scene.textures.length; i++) {
	if (this._scene.textures[i]) {
		this._scene.textures[i].dispose();
		this._scene.textures[i] = null;
	}
}

this._scene.dispose();
this._scene = null;

this._engine.dispose();
this._engine = null;

its overkill i guess to dispose every engine and scene
i think Deltakosh knows this stuff better, why do u even
need to dispose everything?

And btw you can just call engine.dispose() to achieve the same goal

1 Like

To clear the scene, there is scene.dispose(), to clear the engine there is engine.dispose().

From my experience, there was an odd memory leak happening when I was using scene.dispose(), while engine.dispose() worked well at cleaning everything in memory. I could not really investigate further what was wrong in my code, but here was the thread I started at the time:

My concern as a game dev is that when I want to reload a level, or load a new level of my game, I feel that I should be using scene.dispose() but I couldn’t, because of the memory leak I was getting.

1 Like

I to needed to dispose of the scene, and not the engine. The game I’m working on is an MMO, so I need to be able to clean up all the resources whenever the player logs out. While I do eventually call scene.dispose(), I also end up cleaning up all objects that are in use. Each class has a ‘destroy’ function that gets called when the object is no longer needed. If the object contains any BabylonJS objects, it’ll call dispose() on those too. So when logging out, I call destroy() on all the objects, which will dispose of any BabylonJS objects and set their reference to null, and then I call scene.dispose() for good measure. Again it may be overkill, but I think it doesn’t really hurt. And so far I haven’t experienced any sort of memory related issues (knock on wood).

But I believe the scene object contains reference to all materials/meshes/etc. that have been added to the scene, so I suppose you can try to loop through all of those and dispose each individually (essentially manually disposing the scene), and see if there is still a memory leak.

Hey,

you may be interested to use asset containers for your levels:
https://doc.babylonjs.com/how_to/how_to_use_assetcontainer

Also if you can repro the leak in the playground I will definitely fix it!