Просмотр исходного кода

WebGPU: Fix `Renderer` not being garbage collected (#31798)

* Fix leak

* Revert "Fix leak"

This reverts commit a70d4864b672d030edc9e6e55c59727b03b9df1f.

* Fix leak on Geometries

* Change to map, remove redundant conditional, add comment

* Rename to be more specific
Shota Matsuda 8 месяцев назад
Родитель
Сommit
47c6359dcf
2 измененных файлов с 27 добавлено и 0 удалено
  1. 26 0
      src/renderers/common/Geometries.js
  2. 1 0
      src/renderers/common/Renderer.js

+ 26 - 0
src/renderers/common/Geometries.js

@@ -117,6 +117,14 @@ class Geometries extends DataMap {
 		 */
 		this.attributeCall = new WeakMap();
 
+		/**
+		 * Stores the event listeners attached to geometries.
+		 *
+		 * @private
+		 * @type {Map<BufferGeometry,Function>}
+		 */
+		this._geometryDisposeListeners = new Map();
+
 	}
 
 	/**
@@ -189,10 +197,16 @@ class Geometries extends DataMap {
 
 			geometry.removeEventListener( 'dispose', onDispose );
 
+			this._geometryDisposeListeners.delete( geometry );
+
 		};
 
 		geometry.addEventListener( 'dispose', onDispose );
 
+		// see #31798 why tracking separate remove listeners is required right now
+		// TODO: Re-evaluate how onDispose() is managed in this component
+		this._geometryDisposeListeners.set( geometry, onDispose );
+
 	}
 
 	/**
@@ -339,6 +353,18 @@ class Geometries extends DataMap {
 
 	}
 
+	dispose() {
+
+		for ( const [ geometry, onDispose ] of this._geometryDisposeListeners.entries() ) {
+
+			geometry.removeEventListener( 'dispose', onDispose );
+
+		}
+
+		this._geometryDisposeListeners.clear();
+
+	}
+
 }
 
 export default Geometries;

+ 1 - 0
src/renderers/common/Renderer.js

@@ -2197,6 +2197,7 @@ class Renderer {
 
 			this._animation.dispose();
 			this._objects.dispose();
+			this._geometries.dispose();
 			this._pipelines.dispose();
 			this._nodes.dispose();
 			this._bindings.dispose();

粤ICP备19079148号