Optimize initial loading performance
This commit is contained in:
57
src/game/scenes/lazyScenes.ts
Normal file
57
src/game/scenes/lazyScenes.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import Phaser from 'phaser';
|
||||
|
||||
export type LazySceneKey = 'StoryScene' | 'BattleScene' | 'CampScene' | 'EndingScene';
|
||||
|
||||
type LazySceneConstructor = new () => Phaser.Scene;
|
||||
|
||||
const lazySceneLoaders: Record<LazySceneKey, () => Promise<LazySceneConstructor>> = {
|
||||
StoryScene: () => import('./StoryScene').then((module) => module.StoryScene),
|
||||
BattleScene: () => import('./BattleScene').then((module) => module.BattleScene),
|
||||
CampScene: () => import('./CampScene').then((module) => module.CampScene),
|
||||
EndingScene: () => import('./EndingScene').then((module) => module.EndingScene)
|
||||
};
|
||||
|
||||
const pendingSceneLoads = new Map<LazySceneKey, Promise<void>>();
|
||||
|
||||
export function isLazySceneKey(key: string): key is LazySceneKey {
|
||||
return key === 'StoryScene' || key === 'BattleScene' || key === 'CampScene' || key === 'EndingScene';
|
||||
}
|
||||
|
||||
export async function ensureLazyScene(game: Phaser.Game, key: LazySceneKey) {
|
||||
if (game.scene.getScene(key)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const pendingLoad = pendingSceneLoads.get(key);
|
||||
if (pendingLoad) {
|
||||
await pendingLoad;
|
||||
return;
|
||||
}
|
||||
|
||||
const load = lazySceneLoaders[key]().then((SceneClass) => {
|
||||
if (!game.scene.getScene(key)) {
|
||||
game.scene.add(key, SceneClass, false);
|
||||
}
|
||||
});
|
||||
pendingSceneLoads.set(key, load);
|
||||
await load;
|
||||
}
|
||||
|
||||
export async function startLazyScene(scene: Phaser.Scene, key: LazySceneKey, data?: Record<string, unknown>) {
|
||||
await ensureLazyScene(scene.game, key);
|
||||
scene.scene.start(key, data);
|
||||
}
|
||||
|
||||
export async function startGameScene(scene: Phaser.Scene, key: string, data?: Record<string, unknown>) {
|
||||
if (isLazySceneKey(key)) {
|
||||
await startLazyScene(scene, key, data);
|
||||
return;
|
||||
}
|
||||
|
||||
scene.scene.start(key, data);
|
||||
}
|
||||
|
||||
export async function startLazySceneFromGame(game: Phaser.Game, key: LazySceneKey, data?: Record<string, unknown>) {
|
||||
await ensureLazyScene(game, key);
|
||||
game.scene.start(key, data);
|
||||
}
|
||||
Reference in New Issue
Block a user