Skip to content

Commit fb8bb4d

Browse files
authored
FadeTilesRenderer: Disposal simplification (#504)
* Disposal simplification * Remove unused code * Use a tile map instead of references on scene
1 parent 54c934a commit fb8bb4d

File tree

2 files changed

+28
-103
lines changed

2 files changed

+28
-103
lines changed

example/src/FadeManager.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ export class FadeManager {
226226

227227
}
228228

229+
forEachObject( cb ) {
230+
231+
this._fadeState.forEach( ( info, scene ) => cb( scene ) );
232+
233+
}
234+
229235
// Fade the object in
230236
fadeIn( object ) {
231237

example/src/FadeTilesRenderer.js

Lines changed: 22 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,16 @@ function onTileVisibilityChange( scene, tile, visible ) {
4040

4141
}
4242

43-
function onLoadModel( scene ) {
43+
function onLoadModel( scene, tile ) {
4444

4545
this._fadeManager.prepareObject( scene );
46+
this._tileMap.add( scene, tile );
47+
48+
}
49+
50+
function onDisposeModel( scene ) {
51+
52+
this._fadeManager.deleteObject( scene );
4653

4754
}
4855

@@ -53,62 +60,6 @@ function onFadeComplete( object ) {
5360

5461
this._fadeGroup.remove( object );
5562

56-
// TODO: this is basically duplicating all disposal logic from TilesRenderer disposeTile. Would be best to not duplicate this.
57-
if ( this.disposeSet.has( object ) ) {
58-
59-
const info = this.disposeSet.get( object );
60-
const materials = info.materials;
61-
const geometry = info.geometry;
62-
const textures = info.textures;
63-
const parent = info.scene.parent;
64-
const tile = info.tile;
65-
66-
for ( let i = 0, l = geometry.length; i < l; i ++ ) {
67-
68-
geometry[ i ].dispose();
69-
70-
}
71-
72-
for ( let i = 0, l = materials.length; i < l; i ++ ) {
73-
74-
materials[ i ].dispose();
75-
76-
}
77-
78-
for ( let i = 0, l = textures.length; i < l; i ++ ) {
79-
80-
const texture = textures[ i ];
81-
82-
if ( texture.image instanceof ImageBitmap ) {
83-
84-
texture.image.close();
85-
86-
}
87-
88-
texture.dispose();
89-
90-
}
91-
92-
if ( parent ) {
93-
94-
parent.remove( info.scene );
95-
96-
}
97-
98-
this.dispatchEvent( {
99-
type: 'dispose-model',
100-
scene: info.scene,
101-
tile,
102-
} );
103-
104-
if ( this.onDisposeModel ) {
105-
106-
this.onDisposeModel( info.scene, tile );
107-
108-
}
109-
110-
}
111-
11263
}
11364

11465
}
@@ -150,28 +101,30 @@ export const FadeTilesRendererMixin = base => class extends base {
150101

151102
this._fadeManager = fadeManager;
152103
this._fadeGroup = fadeGroup;
104+
this._tileMap = new Map();
153105

154-
this.addEventListener( 'load-model', e => onLoadModel.call( this, e.scene ) );
106+
this.addEventListener( 'load-model', e => onLoadModel.call( this, e.scene, e.tile ) );
107+
this.addEventListener( 'dispose-model', e => onDisposeModel.call( this, e.scene ) );
155108
this.addEventListener( 'tile-visibility-change', e => onTileVisibilityChange.call( this, e.scene, e.tile, e.visible ) );
156109

157110
this.initialLayerRendered = false;
158111
this.prevCameraTransforms = new Map();
159-
this.disposeSet = new Map();
160112

161113
}
162114

163115
update( ...args ) {
164116

165117
const displayActiveTiles = this.displayActiveTiles;
118+
const fadeManager = this._fadeManager;
166119
this.displayActiveTiles = true;
167120

168121
// update the tiles
169-
const fadingBefore = this._fadeManager.fadeCount;
122+
const fadingBefore = fadeManager.fadeCount;
170123

171124
super.update( ...args );
172-
this._fadeManager.update();
125+
fadeManager.update();
173126

174-
const fadingAfter = this._fadeManager.fadeCount;
127+
const fadingAfter = fadeManager.fadeCount;
175128
if ( fadingBefore !== 0 && fadingAfter !== 0 ) {
176129

177130
this.dispatchEvent( { type: 'fade-change' } );
@@ -243,6 +196,13 @@ export const FadeTilesRendererMixin = base => class extends base {
243196

244197
} );
245198

199+
const lruCache = this.lruCache;
200+
const tileMap = this._tileMap;
201+
fadeManager.forEachObject( scene => {
202+
203+
lruCache.markUsed( tileMap.get( scene ) );
204+
205+
} );
246206

247207
}
248208

@@ -253,47 +213,6 @@ export const FadeTilesRendererMixin = base => class extends base {
253213

254214
}
255215

256-
disposeTile( tile ) {
257-
258-
// When a tile is disposed we keep it around if it's currently fading out and mark it for disposal later
259-
const scene = tile.cached.scene;
260-
if ( scene && scene.parent === this._fadeGroup ) {
261-
262-
const cached = tile.cached;
263-
this.disposeSet.set( scene, { tile, ...cached } );
264-
265-
// TODO: duplicating logic from TilesRenderer disposeTile
266-
cached.scene = null;
267-
cached.materials = null;
268-
cached.textures = null;
269-
cached.geometry = null;
270-
cached.metadata = null;
271-
272-
this.activeTiles.delete( tile );
273-
this.visibleTiles.delete( tile );
274-
tile._loadIndex ++;
275-
276-
} else {
277-
278-
super.disposeTile( tile );
279-
this._fadeManager.deleteObject( scene );
280-
281-
}
282-
283-
}
284-
285-
dispose() {
286-
287-
super.dispose();
288-
289-
this.disposeSet.forEach( object => {
290-
291-
onFadeComplete.call( this, object );
292-
293-
} );
294-
295-
}
296-
297216
};
298217

299218
export const FadeTilesRenderer = FadeTilesRendererMixin( TilesRenderer );

0 commit comments

Comments
 (0)