From 44cb722f54dd02369318fdcee4a03140622fc32e Mon Sep 17 00:00:00 2001 From: duckietm Date: Tue, 31 Mar 2026 15:20:28 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20Fixed=20some=20memory=20problems?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RenderTexture leak in IsometricImageFurniVisualization, every direction change or thumbnail update leaked a GPU RenderTexture. Image object leak in FurnitureDynamicThumbnailVisualization, now clears callbacks and src after use. Image object leak in FurnitureBadgeDisplayVisualization, image objects never cleaned up --- .../FurnitureBadgeDisplayVisualization.ts | 9 +++++++++ .../FurnitureDynamicThumbnailVisualization.ts | 6 ++++++ .../IsometricImageFurniVisualization.ts | 17 ++++++++++++++--- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/room/src/object/visualization/furniture/FurnitureBadgeDisplayVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureBadgeDisplayVisualization.ts index 7caa949..8e39508 100644 --- a/packages/room/src/object/visualization/furniture/FurnitureBadgeDisplayVisualization.ts +++ b/packages/room/src/object/visualization/furniture/FurnitureBadgeDisplayVisualization.ts @@ -340,6 +340,15 @@ export class FurnitureBadgeDisplayVisualization extends FurnitureAnimatedVisuali ctx.clearRect(0, 0, badgeCanvas.width, badgeCanvas.height); ctx.drawImage(img, 0, 0, badgeCanvas.width, badgeCanvas.height); tex.source.update(); + img.onload = null; + img.onerror = null; + img.src = ''; + }; + img.onerror = () => + { + img.onload = null; + img.onerror = null; + img.src = ''; }; img.src = badgeUrl; } diff --git a/packages/room/src/object/visualization/furniture/FurnitureDynamicThumbnailVisualization.ts b/packages/room/src/object/visualization/furniture/FurnitureDynamicThumbnailVisualization.ts index 5e320b1..810ca9d 100644 --- a/packages/room/src/object/visualization/furniture/FurnitureDynamicThumbnailVisualization.ts +++ b/packages/room/src/object/visualization/furniture/FurnitureDynamicThumbnailVisualization.ts @@ -33,10 +33,16 @@ export class FurnitureDynamicThumbnailVisualization extends IsometricImageFurniV } else { this.setThumbnailImages(null); } + image.onload = null; + image.onerror = null; + image.src = ''; }; image.onerror = () => { this.setThumbnailImages(null); + image.onload = null; + image.onerror = null; + image.src = ''; }; } else { this.setThumbnailImages(null); diff --git a/packages/room/src/object/visualization/furniture/IsometricImageFurniVisualization.ts b/packages/room/src/object/visualization/furniture/IsometricImageFurniVisualization.ts index 84c2192..a5ee557 100644 --- a/packages/room/src/object/visualization/furniture/IsometricImageFurniVisualization.ts +++ b/packages/room/src/object/visualization/furniture/IsometricImageFurniVisualization.ts @@ -61,6 +61,9 @@ export class IsometricImageFurniVisualization extends FurnitureAnimatedVisualiza if (this._thumbnailImageNormal) { this.addThumbnailAsset(this._thumbnailImageNormal, 64); } else { + if (this._thumbnailTexture instanceof RenderTexture) { + this._thumbnailTexture.destroy(true); + } this._thumbnailTexture = null; this._thumbnailLayerId = -1; } @@ -82,6 +85,9 @@ export class IsometricImageFurniVisualization extends FurnitureAnimatedVisualiza const asset = this.getAsset(assetName, layerId); if (asset) { + if (this._thumbnailTexture instanceof RenderTexture) { + this._thumbnailTexture.destroy(true); + } this._thumbnailTexture = this.generateTransformedThumbnail(k, asset); } @@ -106,6 +112,7 @@ export class IsometricImageFurniVisualization extends FurnitureAnimatedVisualiza protected generateTransformedThumbnail(texture: Texture, asset: IGraphicAsset): Texture { const assetWidth = asset.width; const assetHeight = asset.height; + let outlineTexture: RenderTexture = null; if(this._hasOutline) { @@ -124,10 +131,10 @@ export class IsometricImageFurniVisualization extends FurnitureAnimatedVisualiza container.addChild(background, imageSprite); - const flatRenderTexture = RenderTexture.create({ width: bgWidth, height: bgHeight, resolution: 1 }); - GetRenderer().render({ container, target: flatRenderTexture, clear: true }); + outlineTexture = RenderTexture.create({ width: bgWidth, height: bgHeight, resolution: 1 }); + GetRenderer().render({ container, target: outlineTexture, clear: true }); - texture = flatRenderTexture; + texture = outlineTexture; } texture.source.scaleMode = 'linear'; @@ -197,6 +204,10 @@ export class IsometricImageFurniVisualization extends FurnitureAnimatedVisualiza const renderTexture = RenderTexture.create({ width: renderWidth, height: renderHeight, resolution: 1 }); GetRenderer().render({ container: transformedSprite, target: renderTexture, clear: true }); + if (outlineTexture) { + outlineTexture.destroy(true); + } + return renderTexture; }