From c2470f69b352cdf3e91e732fd7a1243a2db8b763 Mon Sep 17 00:00:00 2001 From: dgflash Date: Thu, 22 May 2025 10:06:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9F=B3=E6=95=88=E6=B1=A0?= =?UTF-8?q?=E4=B8=AD=E8=B5=84=E6=BA=90=E9=87=8A=E6=94=BE=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/core/common/audio/AudioEffectPool.ts | 2 +- assets/core/common/loader/ResLoader.ts | 51 +++++++++++++++++++-- assets/module/common/GameComponent.ts | 6 +-- 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/assets/core/common/audio/AudioEffectPool.ts b/assets/core/common/audio/AudioEffectPool.ts index e4f3a71..5c740e7 100644 --- a/assets/core/common/audio/AudioEffectPool.ts +++ b/assets/core/common/audio/AudioEffectPool.ts @@ -157,7 +157,7 @@ export class AudioEffectPool { // 释放音效资源 this.res.forEach((urls: string[], bundleName: string) => { - urls.forEach(url => resLoader.release(bundleName, url)); + urls.forEach(url => resLoader.release(url, bundleName)); }); // 释放池中播放器 diff --git a/assets/core/common/loader/ResLoader.ts b/assets/core/common/loader/ResLoader.ts index 0411cff..503346d 100644 --- a/assets/core/common/loader/ResLoader.ts +++ b/assets/core/common/loader/ResLoader.ts @@ -1,4 +1,5 @@ -import { __private, Asset, AssetManager, assetManager, error, js, resources, warn } from "cc"; +import { AudioClip } from "cc"; +import { __private, Asset, AssetManager, assetManager, error, ImageAsset, js, JsonAsset, Prefab, resources, SpriteFrame, Texture2D, warn } from "cc"; export type AssetType = __private.__types_globals__Constructor | null; export type Paths = string | string[]; @@ -364,7 +365,7 @@ oops.res.loadDir("game", onProgressCallback, onCompleteCallback); if (bundle) { const asset = bundle.get(path); if (asset) { - this.releasePrefabtDepsRecursively(asset); + this.releasePrefabtDepsRecursively(bundleName, asset); } } } @@ -380,7 +381,7 @@ oops.res.loadDir("game", onProgressCallback, onCompleteCallback); var infos = bundle.getDirWithPath(path); if (infos) { infos.map((info) => { - this.releasePrefabtDepsRecursively(info.uuid); + this.releasePrefabtDepsRecursively(bundleName, info.uuid); }); } @@ -390,17 +391,59 @@ oops.res.loadDir("game", onProgressCallback, onCompleteCallback); } } + /** + * 获取资源路径 + * @param bundleName 资源包名 + * @param uuid 资源唯一编号 + * @returns + */ + getAssetPath(bundleName: string, uuid: string): string { + let b = this.getBundle(bundleName)!; + let info = b.getAssetInfo(uuid)!; + //@ts-ignore + return info.path; + } + /** 释放预制依赖资源 */ - private releasePrefabtDepsRecursively(uuid: string | Asset) { + private releasePrefabtDepsRecursively(bundleName: string, uuid: string | Asset) { if (uuid instanceof Asset) { uuid.decRef(); // assetManager.releaseAsset(uuid); + this.debugLogReleasedAsset(bundleName, uuid); } else { const asset = assetManager.assets.get(uuid); if (asset) { asset.decRef(); // assetManager.releaseAsset(asset); + this.debugLogReleasedAsset(bundleName, asset); + } + } + } + + private debugLogReleasedAsset(bundleName: string, asset: Asset) { + if (asset.refCount == 0) { + let path = this.getAssetPath(bundleName, asset.uuid); + if (asset instanceof JsonAsset) { + console.log("释放资源 - Json", path); + } + else if (asset instanceof Prefab) { + console.log("释放资源 - Prefab", path); + } + else if (asset instanceof SpriteFrame) { + console.log("释放资源 - SpriteFrame", path); + } + else if (asset instanceof Texture2D) { + console.log("释放资源 - Texture2D", path); + } + else if (asset instanceof ImageAsset) { + console.log("释放资源 - ImageAsset", path); + } + else if (asset instanceof AudioClip) { + console.log("释放资源 - AudioClip", path); + } + else { + console.log("释放资源 - 未知", path); } } } diff --git a/assets/module/common/GameComponent.ts b/assets/module/common/GameComponent.ts index 235a26e..68f02c5 100644 --- a/assets/module/common/GameComponent.ts +++ b/assets/module/common/GameComponent.ts @@ -307,7 +307,7 @@ export class GameComponent extends Component { const rps = this.resPaths.get(ResType.Audio); if (rps) { rps.forEach((value: ResRecord) => { - oops.audio.putEffect(value.resId!, value.path, value.bundle); + oops.audio.putEffect(value.resId!, value.path, value.bundle); // 回收音乐效到音效池中等下次使用 }); } } @@ -364,7 +364,7 @@ export class GameComponent extends Component { */ async playEffect(url: string, bundleName?: string) { if (bundleName == null) bundleName = oops.res.defaultBundleName; - await oops.audio.playEffect(url, bundleName, () => { + let resId = await oops.audio.playEffect(url, bundleName, () => { if (!this.isValid) return; const rps = this.resPaths.get(ResType.Audio); @@ -373,7 +373,7 @@ export class GameComponent extends Component { rps.delete(key); } }); - this.addPathToRecord(ResType.Audio, bundleName, url); + this.addPathToRecord(ResType.Audio, bundleName, url, resId); } //#endregion