Browse Source

feat: add AssetManager core module with ref counting

master
npmrun 3 weeks ago
parent
commit
9a57fd6743
  1. 64
      src/core/AssetManager.ts

64
src/core/AssetManager.ts

@ -0,0 +1,64 @@
import { Assets, type AssetsBundle } from "pixi.js";
import { logger } from "./Logger";
class AssetManager {
private referenceCounts: Map<string, number> = new Map();
async init(): Promise<void> {
await Assets.init({ manifest: "/manifest.json" });
logger.debug("AssetManager initialized");
}
async loadBundle(
name: string,
onProgress?: (progress: number) => void
): Promise<AssetsBundle> {
// 已经加载过,增加引用计数
if (this.referenceCounts.has(name)) {
const count = this.referenceCounts.get(name)! + 1;
this.referenceCounts.set(name, count);
logger.debug(`AssetManager: reuse bundle "${name}", refCount = ${count}`);
onProgress?.(1);
return Assets.getBundle(name);
}
// 首次加载
logger.debug(`AssetManager: loading bundle "${name}"`);
const bundle = await Assets.loadBundle(name, onProgress);
this.referenceCounts.set(name, 1);
return bundle;
}
async unloadBundle(name: string): Promise<void> {
if (!this.referenceCounts.has(name)) {
logger.warn(`AssetManager: unloading unloaded bundle "${name}"`);
return;
}
const count = this.referenceCounts.get(name)! - 1;
this.referenceCounts.set(name, count);
if (count <= 0) {
logger.debug(`AssetManager: unloading bundle "${name}"`);
await Assets.unloadBundle(name);
this.referenceCounts.delete(name);
} else {
logger.debug(`AssetManager: decrease refCount for "${name}" to ${count}`);
}
}
isLoaded(name: string): boolean {
return this.referenceCounts.has(name) && this.referenceCounts.get(name)! > 0;
}
getRefCount(name: string): number {
return this.referenceCounts.get(name) ?? 0;
}
clearAll(): void {
this.referenceCounts.clear();
}
}
export const assetManager = new AssetManager();
export default assetManager;
Loading…
Cancel
Save