Browse Source

Merge pull request #18411 from OndrejSpanel/preventRenderListLeak

WebGLRenderLists: Avoid possible memory leak when managing render items.
Mr.doob 5 years ago
parent
commit
d69f9a7d7c
2 changed files with 22 additions and 0 deletions
  1. 2 0
      src/renderers/WebGLRenderer.js
  2. 20 0
      src/renderers/webgl/WebGLRenderLists.js

+ 2 - 0
src/renderers/WebGLRenderer.js

@@ -1181,6 +1181,8 @@ function WebGLRenderer( parameters ) {
 
 		projectObject( scene, camera, 0, _this.sortObjects );
 
+		currentRenderList.cleanup();
+
 		if ( _this.sortObjects === true ) {
 
 			currentRenderList.sort( _opaqueSort, _transparentSort );

+ 20 - 0
src/renderers/webgl/WebGLRenderLists.js

@@ -137,6 +137,25 @@ function WebGLRenderList() {
 
 	}
 
+	// remove any dangling references to make sure no memory is leaked
+	// when the count of objects in a scene is reduced
+	function cleanup() {
+
+		for ( var i = renderItemsIndex; i < renderItems.length; i ++ ) {
+
+			var renderItem = renderItems[ i ];
+			if ( renderItem.id === null ) break;
+			renderItem.object = null;
+			renderItem.geometry = null;
+			renderItem.material = null;
+			renderItem.group = null;
+			renderItem.program = null;
+			renderItem.id = null;
+
+		}
+
+	}
+
 	return {
 		opaque: opaque,
 		transparent: transparent,
@@ -144,6 +163,7 @@ function WebGLRenderList() {
 		init: init,
 		push: push,
 		unshift: unshift,
+		cleanup: cleanup,
 
 		sort: sort
 	};