From cc8f05fdb808530ba422a88cbcd5d905274334ee Mon Sep 17 00:00:00 2001 From: Hu Song Date: Wed, 29 Dec 2021 18:15:39 +0800 Subject: [PATCH] Fix ResourceManager Has not Destoryed All Cache (#621) * fix: resourceManager has't destory all cache --- packages/core/src/Engine.ts | 2 +- packages/core/src/asset/ResourceManager.ts | 28 +++++++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/core/src/Engine.ts b/packages/core/src/Engine.ts index e6925f881e..d34f760c67 100644 --- a/packages/core/src/Engine.ts +++ b/packages/core/src/Engine.ts @@ -317,7 +317,7 @@ export class Engine extends EventDispatcher { this._animate = null; this._sceneManager._activeScene.destroy(); - this._resourceManager.gc(); + this._resourceManager._destroy(); // If engine destroy, callComponentDestroy() maybe will not call anymore. this._componentsManager.callComponentDestroy(); this._sceneManager = null; diff --git a/packages/core/src/asset/ResourceManager.ts b/packages/core/src/asset/ResourceManager.ts index d2fc8bb984..659b3b203b 100644 --- a/packages/core/src/asset/ResourceManager.ts +++ b/packages/core/src/asset/ResourceManager.ts @@ -125,12 +125,7 @@ export class ResourceManager { * @remarks The release principle is that it is not referenced by the components, including direct and indirect reference. */ gc(): void { - const objects = ObjectValues(this._refObjectPool); - for (let i = 0, len = objects.length; i < len; i++) { - if (!objects[i].isGCIgnored) { - objects[i].destroy(); - } - } + this._gc(false); } /** @@ -176,6 +171,18 @@ export class ResourceManager { delete this._refObjectPool[id]; } + /** + * @internal + */ + _destroy(): void { + this.cancelNotLoaded(); + this._gc(true); + this._assetPool = null; + this._assetUrlPool = null; + this._refObjectPool = null; + this._loadingPromises = null; + } + private _assignDefaultOptions(assetInfo: LoadItem): LoadItem | never { assetInfo.type = assetInfo.type ?? ResourceManager._getTypeByUrl(assetInfo.url); if (assetInfo.type === undefined) { @@ -212,6 +219,15 @@ export class ResourceManager { .catch(() => {}); return promise; } + + private _gc(forceDestroy: boolean): void { + const objects = ObjectValues(this._refObjectPool); + for (let i = 0, len = objects.length; i < len; i++) { + if (!objects[i].isGCIgnored || forceDestroy) { + objects[i].destroy(); + } + } + } } /**