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

This commit is contained in:
unanmed 2026-03-30 19:07:13 +08:00
parent 4fc6db3e79
commit fe67939a05
12 changed files with 139 additions and 47 deletions

View File

@ -3,6 +3,7 @@
"dependencies": { "dependencies": {
"@motajs/audio": "workspace:*", "@motajs/audio": "workspace:*",
"@motajs/render": "workspace:*", "@motajs/render": "workspace:*",
"@motajs/client-base": "workspace:*" "@motajs/client-base": "workspace:*",
"@user/data-base": "workspace:*"
} }
} }

View File

@ -8,7 +8,7 @@ import {
} from '@motajs/audio'; } from '@motajs/audio';
import { MotaAssetsLoader } from './load/loader'; import { MotaAssetsLoader } from './load/loader';
import { AutotileProcessor, MaterialManager } from './material'; import { AutotileProcessor, MaterialManager } from './material';
import { loadProgress } from '@user/data-base'; import { dataLoader, loadProgress } from '@user/data-base';
//#region 音频实例 //#region 音频实例
@ -35,9 +35,10 @@ export const autotile = new AutotileProcessor(materials);
//#region 加载实例 //#region 加载实例
/** 全局加载实例 */ /** 客户端加载实例 */
export const loader = new MotaAssetsLoader( export const loader = new MotaAssetsLoader(
loadProgress, loadProgress,
dataLoader,
audioContext, audioContext,
soundPlayer, soundPlayer,
materials materials

View File

@ -1 +1 @@
export * from './processor'; export * from './loader';

View File

@ -17,26 +17,15 @@ import {
LoadAudioProcessor, LoadAudioProcessor,
LoadFontProcessor, LoadFontProcessor,
LoadImageProcessor, LoadImageProcessor,
LoadJSONProcessor,
LoadTextProcessor, LoadTextProcessor,
LoadZipProcessor LoadZipProcessor
} from './processor'; } from '@user/data-base';
import { IMotaAudioContext, ISoundPlayer } from '@motajs/audio'; import { IMotaAudioContext, ISoundPlayer } from '@motajs/audio';
import { loading } from '@user/data-base'; import { loading } from '@user/data-base';
import { IMaterialManager } from '../material'; import { IMaterialManager } from '../material';
import { ITextureSplitter, Texture, TextureRowSplitter } from '@motajs/render'; import { ITextureSplitter, Texture, TextureRowSplitter } from '@motajs/render';
import { iconNames } from './data'; import { iconNames } from './data';
import { IMotaDataLoader } from '@user/data-base';
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>;
}
export class MotaAssetsLoader implements IMotaAssetsLoader { export class MotaAssetsLoader implements IMotaAssetsLoader {
/** 当前是否正在进行加载 */ /** 当前是否正在进行加载 */
@ -54,12 +43,8 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
FontFace FontFace
>; >;
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>; readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>; readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
/** 当前已添加的加载任务 */
private readonly tasks: Set<LoadTaskStore> = new Set();
/** 素材索引 */ /** 素材索引 */
private materialsCounter: number = 0; private materialsCounter: number = 0;
/** 贴图行分割器,用于处理遗留 `icons.png` */ /** 贴图行分割器,用于处理遗留 `icons.png` */
@ -67,6 +52,7 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
constructor( constructor(
readonly progress: ILoadProgressTotal, readonly progress: ILoadProgressTotal,
private readonly dataLoader: IMotaDataLoader,
private readonly ac: IMotaAudioContext, private readonly ac: IMotaAudioContext,
private readonly sounds: ISoundPlayer<SoundIds>, private readonly sounds: ISoundPlayer<SoundIds>,
private readonly materials: IMaterialManager private readonly materials: IMaterialManager
@ -75,7 +61,6 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
this.audioProcessor = new LoadAudioProcessor(ac); this.audioProcessor = new LoadAudioProcessor(ac);
this.fontProcessor = new LoadFontProcessor(); this.fontProcessor = new LoadFontProcessor();
this.textProcessor = new LoadTextProcessor(); this.textProcessor = new LoadTextProcessor();
this.jsonProcessor = new LoadJSONProcessor();
this.zipProcessor = new LoadZipProcessor(); this.zipProcessor = new LoadZipProcessor();
this.rowSplitter = new TextureRowSplitter(); this.rowSplitter = new TextureRowSplitter();
} }
@ -469,7 +454,7 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
url: `loadList.json`, url: `loadList.json`,
dataType: LoadDataType.JSON, dataType: LoadDataType.JSON,
identifier: '@system-loadList', identifier: '@system-loadList',
processor: this.jsonProcessor, processor: this.dataLoader.jsonProcessor,
progress: { onProgress() {} } progress: { onProgress() {} }
}); });
@ -505,27 +490,15 @@ export class MotaAssetsLoader implements IMotaAssetsLoader {
task: ILoadTask<LoadDataType, R>, task: ILoadTask<LoadDataType, R>,
onLoaded: CustomLoadFunc<R> onLoaded: CustomLoadFunc<R>
): Promise<R> { ): Promise<R> {
this.progress.addTask(task); return this.dataLoader.addCustomLoadTask(task, onLoaded);
const { promise, resolve } = Promise.withResolvers<R>();
const store: LoadTaskStore<LoadDataType, R> = {
task,
onLoaded,
loadPromise: promise,
loadResolve: resolve
};
this.tasks.add(store);
return promise;
} }
load(): Promise<any[]> { async load(): Promise<void> {
const tasks = [...this.tasks].map(async task => { this.loading = true;
task.task.start(); this.loaded = false;
const data = await task.task.loaded(); await this.dataLoader.load();
await task.onLoaded(data); this.loading = false;
task.loadResolve(data); this.loaded = true;
return data;
});
return Promise.all(tasks);
} }
//#endregion //#endregion

View File

@ -57,8 +57,6 @@ export interface IMotaAssetsLoader {
>; >;
/** 文字处理器 */ /** 文字处理器 */
readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>; readonly textProcessor: ILoadTaskProcessor<LoadDataType.Text, string>;
/** JSON 处理器 */
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
/** `zip` 压缩包处理器 */ /** `zip` 压缩包处理器 */
readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>; readonly zipProcessor: ILoadTaskProcessor<LoadDataType.ArrayBuffer, JSZip>;
@ -82,5 +80,5 @@ export interface IMotaAssetsLoader {
* *
* @returns `Promise` * @returns `Promise`
*/ */
load(): Promise<any[]>; load(): Promise<void>;
} }

View File

@ -1,6 +1,7 @@
{ {
"name": "@user/data-base", "name": "@user/data-base",
"dependencies": { "dependencies": {
"@motajs/types": "workspace:*" "@motajs/types": "workspace:*",
"@motajs/loader": "workspace:*"
} }
} }

View File

@ -1 +1,4 @@
export * from './load';
export * from './game'; export * from './game';
export * from './ins';

View File

@ -0,0 +1,11 @@
import { LoadProgressTotal } from '@motajs/loader';
import { MotaDataLoader } from './load';
//#region 加载实例
/** 加载进度 */
export const loadProgress = new LoadProgressTotal();
/** 数据端加载对象 */
export const dataLoader = new MotaDataLoader(loadProgress);
//#endregion

View File

@ -0,0 +1,3 @@
export * from './loader';
export * from './processor';
export * from './types';

View File

@ -0,0 +1,63 @@
import {
ILoadProgressTotal,
LoadDataType,
ILoadTask,
ILoadTaskProcessor
} from '@motajs/loader';
import { CustomLoadFunc, IMotaDataLoader } from './types';
import { LoadJSONProcessor } from './processor';
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>;
}
export class MotaDataLoader implements IMotaDataLoader {
/** 当前已添加的加载任务 */
private readonly tasks: Set<LoadTaskStore> = new Set();
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
constructor(readonly progress: ILoadProgressTotal) {
this.jsonProcessor = new LoadJSONProcessor();
}
//#region 对外接口
initSystemLoadTask(): void {}
addCustomLoadTask<R>(
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;
}
async load(): Promise<void> {
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;
});
await Promise.all(tasks);
}
//#endregion
}

View File

@ -0,0 +1,38 @@
import {
ILoadProgressTotal,
ILoadTask,
ILoadTaskProcessor,
LoadDataType
} from '@motajs/loader';
export type CustomLoadFunc<R> = (data: R) => Promise<void>;
export interface IMotaDataLoader {
/** 加载进度对象 */
readonly progress: ILoadProgressTotal;
/** json 处理器 */
readonly jsonProcessor: ILoadTaskProcessor<LoadDataType.JSON, any>;
/**
*
*/
initSystemLoadTask(): void;
/**
*
* @param task
* @param onLoad
* @returns `Promise` `onLoad` `Promise`
*/
addCustomLoadTask<R>(
task: ILoadTask<LoadDataType, R>,
onLoad: CustomLoadFunc<R>
): Promise<R>;
/**
*
* @returns `Promise`
*/
load(): Promise<void>;
}