refactor: 加载系统核心移动至数据端

This commit is contained in:
AncTe committed 2026-03-30 19:07:13 +08:00
1 parent 4fc6db3e79
commit fe67939a05
12 files changed
+139 -47

No files matched your search

+3 -2
View File
@@ -8,7 +8,7 @@ import {
} from '@motajs/audio';
import { MotaAssetsLoader } from './load/loader';
import { AutotileProcessor, MaterialManager } from './material';
import { loadProgress } from '@user/data-base';
import { dataLoader, loadProgress } from '@user/data-base';
//#region 音频实例
@@ -35,9 +35,10 @@ export const autotile = new AutotileProcessor(materials);
//#region 加载实例
/** 全局加载实例 */
/** 客户端加载实例 */
export const loader = new MotaAssetsLoader(
loadProgress,
dataLoader,
audioContext,
soundPlayer,
materials
+1 -1
View File
@@ -1 +1 @@
export * from './processor';
export * from './loader';
+11 -38
View File
@@ -17,26 +17,15 @@ import {
LoadAudioProcessor,
LoadFontProcessor,
LoadImageProcessor,
LoadJSONProcessor,
LoadTextProcessor,
LoadZipProcessor
} from './processor';
} from '@user/data-base';
import { IMotaAudioContext, ISoundPlayer } from '@motajs/audio';
import { loading } from '@user/data-base';
import { IMaterialManager } from '../material';
import { ITextureSplitter, Texture, TextureRowSplitter } from '@motajs/render';
import { iconNames } from './data';
interface LoadTaskStore<T extends LoadDataType = LoadDataType, R = any> {
/** 加载任务对象 */
readonly task: ILoadTask<T, R>;
/** 当 `onLoaded` 兑现后兑现的 `Promise` */
readonly loadPromise: Promise<R>;
/** 兑现 `loadPromise` */
readonly loadResolve: (data: R) => void;
/** 当加载任务完成时执行的函数 */
readonly onLoaded: CustomLoadFunc<R>;
}
import { IMotaDataLoader } from '@user/data-base';
export class MotaAssetsLoader implements IMotaAssetsLoader {
/** 当前是否正在进行加载 */
@@ -54,12 +43,8 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
FontFace
>;
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
/** 当前已添加的加载任务 */
private readonly tasks: Set<LoadTaskStore> = new Set();
/** 素材索引 */
private materialsCounter: number = 0;
/** 贴图行分割器,用于处理遗留 `icons.png` */
@@ -67,6 +52,7 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
constructor(
readonly progress: ILoadProgressTotal,
private readonly dataLoader: IMotaDataLoader,
private readonly ac: IMotaAudioContext,
private readonly sounds: ISoundPlayer<SoundIds>,
private readonly materials: IMaterialManager
@@ -75,7 +61,6 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
this.audioProcessor = new LoadAudioProcessor(ac);
this.fontProcessor = new LoadFontProcessor();
this.textProcessor = new LoadTextProcessor();
this.jsonProcessor = new LoadJSONProcessor();
this.zipProcessor = new LoadZipProcessor();
this.rowSplitter = new TextureRowSplitter();
}
@@ -469,7 +454,7 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
url: `loadList.json`,
dataType: LoadDataType.JSON,
identifier: '@system-loadList',
processor: this.jsonProcessor,
processor: this.dataLoader.jsonProcessor,
progress: { onProgress() {} }
});
@@ -505,27 +490,15 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
task: ILoadTask<LoadDataType, R>,
onLoaded: CustomLoadFunc<R>
): Promise<R> {
this.progress.addTask(task);
const { promise, resolve } = Promise.withResolvers<R>();
const store: LoadTaskStore<LoadDataType, R> = {
task,
onLoaded,
loadPromise: promise,
loadResolve: resolve
};
this.tasks.add(store);
return promise;
return this.dataLoader.addCustomLoadTask(task, onLoaded);
}
load(): Promise<any[]> {
const tasks = [...this.tasks].map(async task => {
task.task.start();
const data = await task.task.loaded();
await task.onLoaded(data);
task.loadResolve(data);
return data;
});
return Promise.all(tasks);
async load(): Promise<void> {
this.loading = true;
this.loaded = false;
await this.dataLoader.load();
this.loading = false;
this.loaded = true;
}
//#endregion
@@ -1,66 +0,0 @@
import { IMotaAudioContext } from '@motajs/audio';
import { ILoadTask, ILoadTaskProcessor, LoadDataType } from '@motajs/loader';
import JSZip from 'jszip';
export class LoadImageProcessor implements ILoadTaskProcessor<
LoadDataType.Blob,
ImageBitmap
> {
process(response: Blob): Promise<ImageBitmap> {
return createImageBitmap(response);
}
}
export class LoadAudioProcessor implements ILoadTaskProcessor<
LoadDataType.Uint8Array,
AudioBuffer | null
> {
constructor(private readonly ac: IMotaAudioContext) {}
process(response: Uint8Array<ArrayBuffer>): Promise<AudioBuffer | null> {
return this.ac.decodeToAudioBuffer(response);
}
}
export class LoadFontProcessor implements ILoadTaskProcessor<
LoadDataType.ArrayBuffer,
FontFace
> {
process(
response: ArrayBuffer,
task: ILoadTask<LoadDataType.ArrayBuffer, FontFace>
): Promise<FontFace> {
const font = new FontFace(task.identifier, response);
if (font.status === 'loaded') return Promise.resolve(font);
else return font.load();
}
}
export class LoadZipProcessor implements ILoadTaskProcessor<
LoadDataType.ArrayBuffer,
JSZip
> {
async process(response: ArrayBuffer): Promise<JSZip> {
const zip = new JSZip();
await zip.loadAsync(response);
return zip;
}
}
export class LoadTextProcessor implements ILoadTaskProcessor<
LoadDataType.Text,
string
> {
process(response: string): Promise<string> {
return Promise.resolve(response);
}
}
export class LoadJSONProcessor<T> implements ILoadTaskProcessor<
LoadDataType.JSON,
T
> {
process(response: any): Promise<T> {
return Promise.resolve(response);
}
}
+1 -3
View File
@@ -57,8 +57,6 @@ export interface IMotaAssetsLoader {
>;
/** 文字处理器 */
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
/** JSON 处理器 */
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
/** `zip` 压缩包处理器 */
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
@@ -82,5 +80,5 @@ export interface IMotaAssetsLoader {
* 开始所有加载任务的加载工作
* @returns 一个 `Promise`,当所有加载任务加载完成后兑现
*/
load(): Promise<any[]>;
load(): Promise<void>;
}