You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.5 KiB
79 lines
2.5 KiB
import { Texture2D, AudioClip, Asset, SpriteFrame, assetManager } from "cc";
|
|
|
|
/**图片内存 */
|
|
export default class ResourceMemoryChecker {
|
|
|
|
static check = {};
|
|
|
|
// 纹理资源计算(含SpriteFrame)
|
|
static getTextureMemory(texture: Texture2D): number {
|
|
if(this.check[texture.uuid]){return 0;}
|
|
this.check[texture.uuid] = 1;
|
|
const formatSizeMap = {
|
|
[Texture2D.PixelFormat.RGBA8888]: 4,
|
|
[Texture2D.PixelFormat.RGB888]: 3,
|
|
[Texture2D.PixelFormat.RGBA4444]: 2,
|
|
// 扩展其他格式...
|
|
};
|
|
|
|
if(!formatSizeMap[texture.getPixelFormat()]){
|
|
ConsoleEx.Log(texture.getPixelFormat())
|
|
}
|
|
const bpp = formatSizeMap[texture.getPixelFormat()] || 4;
|
|
return texture.width * texture.height * bpp;
|
|
}
|
|
|
|
// 音频资源计算(单位:字节)
|
|
static getAudioMemory(clip: AudioClip): number {
|
|
//@ts-ignore
|
|
return clip['_file']?.size || clip.sampleCount * clip.channelCount * 2;
|
|
}
|
|
|
|
// 统一测量入口
|
|
static getMemoryUsage(asset: Asset): number {
|
|
if (asset instanceof Texture2D) return this.getTextureMemory(asset);
|
|
//@ts-ignore
|
|
if (asset instanceof SpriteFrame) return this.getTextureMemory(asset.texture);
|
|
if (asset instanceof AudioClip) return this.getAudioMemory(asset);
|
|
// 其他资源类型可扩展
|
|
return 0;
|
|
}
|
|
|
|
|
|
static generateMemoryReport(): {
|
|
totalKB: number,
|
|
totalMB:number,
|
|
details: { uuid: string, type: string, sizeKB: number,sizeMB:number }[]
|
|
} {
|
|
const details = [];
|
|
let totalBytes = 0;
|
|
this.check = {};
|
|
//const loadedAssets = Array.from(assetManager.assets.values());
|
|
assetManager.assets.forEach(asset => {
|
|
const bytes = this.getMemoryUsage(asset);
|
|
const uuid = asset.uuid;
|
|
if (bytes > 0) {
|
|
totalBytes += bytes;
|
|
details.push({
|
|
uuid,
|
|
type: asset.constructor.name,
|
|
sizeKB: parseFloat((bytes / 1024).toFixed(2)),
|
|
sizeMB: parseFloat((bytes / 1024 /1024) .toFixed(2))
|
|
});
|
|
}
|
|
});
|
|
|
|
details.sort((a,b)=>{
|
|
return b.sizeKB - a.sizeKB;
|
|
})
|
|
|
|
return {
|
|
totalKB: parseFloat((totalBytes / 1024).toFixed(2)),
|
|
totalMB: parseFloat((totalBytes / 1024/ 1024).toFixed(2)) ,
|
|
details
|
|
};
|
|
}
|
|
|
|
}
|
|
|
|
window["ResourceMemoryChecker"] = ResourceMemoryChecker;
|