Skip to content

Commit 47c6359

Browse files
authored
WebGPU: Fix Renderer not being garbage collected (#31798)
* Fix leak * Revert "Fix leak" This reverts commit a70d486. * Fix leak on Geometries * Change to map, remove redundant conditional, add comment * Rename to be more specific
1 parent 832291b commit 47c6359

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/renderers/common/Geometries.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ class Geometries extends DataMap {
117117
*/
118118
this.attributeCall = new WeakMap();
119119

120+
/**
121+
* Stores the event listeners attached to geometries.
122+
*
123+
* @private
124+
* @type {Map<BufferGeometry,Function>}
125+
*/
126+
this._geometryDisposeListeners = new Map();
127+
120128
}
121129

122130
/**
@@ -189,10 +197,16 @@ class Geometries extends DataMap {
189197

190198
geometry.removeEventListener( 'dispose', onDispose );
191199

200+
this._geometryDisposeListeners.delete( geometry );
201+
192202
};
193203

194204
geometry.addEventListener( 'dispose', onDispose );
195205

206+
// see #31798 why tracking separate remove listeners is required right now
207+
// TODO: Re-evaluate how onDispose() is managed in this component
208+
this._geometryDisposeListeners.set( geometry, onDispose );
209+
196210
}
197211

198212
/**
@@ -339,6 +353,18 @@ class Geometries extends DataMap {
339353

340354
}
341355

356+
dispose() {
357+
358+
for ( const [ geometry, onDispose ] of this._geometryDisposeListeners.entries() ) {
359+
360+
geometry.removeEventListener( 'dispose', onDispose );
361+
362+
}
363+
364+
this._geometryDisposeListeners.clear();
365+
366+
}
367+
342368
}
343369

344370
export default Geometries;

src/renderers/common/Renderer.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2197,6 +2197,7 @@ class Renderer {
21972197

21982198
this._animation.dispose();
21992199
this._objects.dispose();
2200+
this._geometries.dispose();
22002201
this._pipelines.dispose();
22012202
this._nodes.dispose();
22022203
this._bindings.dispose();

0 commit comments

Comments
 (0)