refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件 - 移除 MISSION_UPDATE 事件常量 - 优化游戏事件枚举定义
This commit is contained in:
262
.qoder/repowiki/zh/content/核心系统/事件系统.md
Normal file
262
.qoder/repowiki/zh/content/核心系统/事件系统.md
Normal file
@@ -0,0 +1,262 @@
|
||||
# 事件系统
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [event.md](file://doc/core/common/event.md)
|
||||
- [MessageManager.ts](file://extensions/oops-plugin-framework/assets/core/common/event/MessageManager.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [TopComp.ts](file://assets/script/game/map/TopComp.ts)
|
||||
- [MInfoComp.ts](file://assets/script/game/map/MInfoComp.ts)
|
||||
- [move.ts](file://assets/script/game/map/move.ts)
|
||||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [事件常量分类与业务含义](#事件常量分类与业务含义)
|
||||
2. [事件监听机制与内存管理](#事件监听机制与内存管理)
|
||||
3. [事件系统解耦设计与应用示例](#事件系统解耦设计与应用示例)
|
||||
4. [事件命名规范与作用域管理](#事件命名规范与作用域管理)
|
||||
5. [事件调试与常见问题解决方案](#事件调试与常见问题解决方案)
|
||||
|
||||
## 事件常量分类与业务含义
|
||||
|
||||
基于 `GameEvent.ts` 枚举文件,游戏全局事件按功能模块可分为以下几类:
|
||||
|
||||
### 战斗流程事件
|
||||
- `MissionStart`:关卡开始时触发,初始化战斗环境
|
||||
- `MissionWin`:玩家胜利时触发,进入结算流程
|
||||
- `MissionLoss`:玩家失败时触发,显示失败界面
|
||||
- `FightStart`:战斗正式开始,激活战斗逻辑
|
||||
- `FightEnd`:战斗结束,无论胜负均触发
|
||||
- `NewWave`:新一波敌人出现,用于刷新怪物生成
|
||||
|
||||
### 英雄相关事件
|
||||
- `HeroLvUp`:英雄升级时触发,用于属性更新和UI反馈
|
||||
- `HeroUnlock`:新英雄解锁时触发,通知UI展示获取动画
|
||||
- `HeroDead`:英雄死亡时触发,处理死亡逻辑和成就判断
|
||||
- `HeroSelect`:选择出战英雄时触发,更新队伍配置
|
||||
- `HeroSkillSelect`:技能选择阶段触发,激活技能选择界面
|
||||
|
||||
### 资源更新事件
|
||||
- `GOLD_UPDATE`:金币数量变化时触发,用于UI金币显示更新
|
||||
- `DIAMOND_UPDATE`:钻石数量变化时触发
|
||||
- `MEAT_UPDATE`:游戏内特定资源"肉"的数量更新
|
||||
- `MISSION_UPDATE`:关卡进度更新,用于顶部UI显示当前关卡
|
||||
|
||||
### 界面与交互事件
|
||||
- `ShopOpen`:商店界面打开时触发
|
||||
- `HerosOpen`:英雄列表界面打开
|
||||
- `RestOpen`:休息界面打开
|
||||
- `HeroInfoOpen`:英雄详情界面打开
|
||||
- `GuideStart`、`GuideEnd`:新手引导流程控制
|
||||
|
||||
### 地图移动事件
|
||||
- `MAP_MOVE_END_LEFT`:地图向左移动到达边界
|
||||
- `MAP_MOVE_END_RIGHT`:地图向右移动到达边界
|
||||
- `CardsClose`:卡牌选择界面关闭
|
||||
|
||||
### 卡牌与技能事件
|
||||
- `CardRefresh`:卡牌刷新时触发
|
||||
- `UseHeroCard`:使用英雄卡牌
|
||||
- `UseSkillCard`:使用技能卡牌
|
||||
- `UseTalentCard`:使用天赋卡牌
|
||||
- `CastSkill`:技能施放
|
||||
|
||||
**Section sources**
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
|
||||
## 事件监听机制与内存管理
|
||||
|
||||
### 持续监听与单次监听的差异
|
||||
|
||||
`oops.message.on()` 用于注册持续监听的事件,监听器会一直存在直到显式移除。适用于需要长期响应的事件,如资源更新、状态变化等。
|
||||
|
||||
```typescript
|
||||
oops.message.on(GameEvent.GOLD_UPDATE, this.onGoldUpdate, this);
|
||||
```
|
||||
|
||||
`oops.message.once()` 用于注册只触发一次的事件监听,事件响应后监听器自动移除。适用于一次性流程,如初始化完成、首次加载等场景。
|
||||
|
||||
```typescript
|
||||
oops.message.once(GameEvent.GameServerConnected, this.onHandler, this);
|
||||
```
|
||||
|
||||
从 `MessageManager.ts` 的实现可以看出,`once()` 方法通过创建一个包装函数 `_listener`,在事件触发后立即调用 `off()` 移除自身,确保只执行一次。
|
||||
|
||||
### 内存泄漏防范措施
|
||||
|
||||
为防止内存泄漏,必须在对象销毁时移除所有事件监听。通常在 `onDestroy()` 或 `reset()` 生命周期方法中执行:
|
||||
|
||||
```typescript
|
||||
protected onDestroy() {
|
||||
oops.message.off(GameEvent.GOLD_UPDATE, this.onGoldUpdate, this);
|
||||
}
|
||||
```
|
||||
|
||||
`MessageManager` 在注册事件时会检查重复注册,并发出警告,避免同一对象对同一事件的重复监听。
|
||||
|
||||
**Section sources**
|
||||
- [event.md](file://doc/core/common/event.md)
|
||||
- [MessageManager.ts](file://extensions/oops-plugin-framework/assets/core/common/event/MessageManager.ts)
|
||||
|
||||
## 事件系统解耦设计与应用示例
|
||||
|
||||
### 解耦模块间通信
|
||||
|
||||
事件系统通过发布-订阅模式实现模块间的松耦合通信。发送方无需知道接收方的存在,接收方也无需主动轮询状态变化。
|
||||
|
||||
#### 英雄升级事件(HeroLvUp)的完整流程
|
||||
|
||||
1. **事件触发**:当英雄经验值满足升级条件时,触发 `HeroLvUp` 事件
|
||||
2. **UI更新**:UI组件监听 `HeroLvUp` 事件,更新英雄等级显示和属性面板
|
||||
3. **成就判断**:成就系统监听该事件,判断是否达成"快速升级"等成就条件
|
||||
4. **天赋系统响应**:某些天赋(如"每升5级攻击力+10%")在等级变化时触发效果
|
||||
|
||||
#### 金币更新事件的实际应用
|
||||
|
||||
在 `SingletonModuleComp.ts` 中,当金币数量变化时触发 `GOLD_UPDATE` 事件:
|
||||
|
||||
```typescript
|
||||
updateGold(gold: number) {
|
||||
this.vmdata.gold += gold;
|
||||
// ... 更新云端数据
|
||||
oops.message.dispatchEvent(GameEvent.GOLD_UPDATE);
|
||||
}
|
||||
```
|
||||
|
||||
在 `TopComp.ts` 中,顶部UI组件监听该事件并执行视觉反馈:
|
||||
|
||||
```typescript
|
||||
onGoldUpdate(event: string, data: any) {
|
||||
tween(this.node.getChildByName("bar").getChildByName("gold").getChildByName("num").getComponent(Label).node)
|
||||
.to(0.1, { scale: v3(1.2, 1.2, 1) })
|
||||
.to(0.1, { scale: v3(1, 1, 1) })
|
||||
.start();
|
||||
}
|
||||
```
|
||||
|
||||
这种设计使得金币逻辑与UI展示完全分离,任何模块都可以独立修改而不影响其他部分。
|
||||
|
||||
### 地图移动事件的循环机制
|
||||
|
||||
`move.ts` 文件展示了 `MAP_MOVE_END_LEFT` 和 `MAP_MOVE_END_RIGHT` 事件的闭环设计:
|
||||
|
||||
1. 地图移动组件监听边界到达事件
|
||||
2. 当到达边界时,重置位置并派发对应的边界事件
|
||||
3. 其他组件可以监听这些事件执行相应逻辑
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[地图移动] --> B{到达右边界?}
|
||||
B --> |是| C[重置到左边界]
|
||||
C --> D[派发MAP_MOVE_END_LEFT]
|
||||
D --> E[其他组件响应]
|
||||
B --> |否| F{到达左边界?}
|
||||
F --> |是| G[重置到右边界]
|
||||
G --> H[派发MAP_MOVE_END_RIGHT]
|
||||
H --> I[其他组件响应]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [TopComp.ts](file://assets/script/game/map/TopComp.ts)
|
||||
- [move.ts](file://assets/script/game/map/move.ts)
|
||||
|
||||
**Section sources**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [TopComp.ts](file://assets/script/game/map/TopComp.ts)
|
||||
- [MInfoComp.ts](file://assets/script/game/map/MInfoComp.ts)
|
||||
- [move.ts](file://assets/script/game/map/move.ts)
|
||||
|
||||
## 事件命名规范与作用域管理
|
||||
|
||||
### 命名规范
|
||||
|
||||
事件名称采用大写常量格式,使用有意义的描述性名称。遵循以下原则:
|
||||
|
||||
- 使用名词或名词短语,如 `GOLD_UPDATE`、`HeroLvUp`
|
||||
- 模块相关事件添加前缀,如 `MAP_MOVE_END_LEFT`
|
||||
- 业务流程事件使用动词,如 `MissionWin`、`FightStart`
|
||||
- 避免缩写,确保名称清晰可读
|
||||
|
||||
### 作用域管理
|
||||
|
||||
事件系统通过第三个参数 `this` 管理作用域,确保回调函数在正确的上下文中执行。这解决了 JavaScript/TypeScript 中常见的 `this` 上下文丢失问题。
|
||||
|
||||
在注册事件时,必须传入正确的对象引用,以便在移除监听时能够精确匹配。
|
||||
|
||||
```typescript
|
||||
oops.message.on(GameEvent.GOLD_UPDATE, this.onGoldUpdate, this);
|
||||
```
|
||||
|
||||
这里的 `this` 确保了:
|
||||
1. 回调函数在正确的对象实例上下文中执行
|
||||
2. 移除监听时能够准确找到对应的监听器
|
||||
3. 避免不同实例间的监听器混淆
|
||||
|
||||
**Section sources**
|
||||
- [MessageManager.ts](file://extensions/oops-plugin-framework/assets/core/common/event/MessageManager.ts)
|
||||
|
||||
## 事件调试与常见问题解决方案
|
||||
|
||||
### 调试技巧
|
||||
|
||||
#### 事件监听器dump
|
||||
|
||||
可以通过访问 `MessageManager` 的内部 `events` 对象来查看当前所有注册的事件监听器,便于调试和性能分析。
|
||||
|
||||
#### 事件触发跟踪
|
||||
|
||||
在开发环境中,可以临时修改 `dispatchEvent` 方法,添加日志输出,跟踪所有事件的触发情况。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[事件注册] --> B[事件派发]
|
||||
B --> C{是否有监听器?}
|
||||
C --> |是| D[执行所有监听器]
|
||||
D --> E[回调函数执行]
|
||||
C --> |否| F[无操作]
|
||||
```
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 事件重复注册
|
||||
|
||||
**问题**:同一对象对同一事件多次注册,导致回调执行多次。
|
||||
|
||||
**解决方案**:
|
||||
1. 在 `onLoad()` 中注册事件,在 `onDestroy()` 中移除
|
||||
2. 使用 `MessageManager` 的重复注册警告功能及时发现
|
||||
3. 在复杂场景下,使用标志位确保只注册一次
|
||||
|
||||
#### this上下文丢失
|
||||
|
||||
**问题**:回调函数中的 `this` 指向错误的对象。
|
||||
|
||||
**解决方案**:
|
||||
1. 严格按照 `oops.message.on(event, handler, this)` 格式注册
|
||||
2. 避免使用箭头函数作为回调,除非明确不需要绑定作用域
|
||||
3. 在 TypeScript 中利用类型检查确保第三个参数正确
|
||||
|
||||
#### 内存泄漏
|
||||
|
||||
**问题**:对象销毁后事件监听器未移除,导致对象无法被垃圾回收。
|
||||
|
||||
**解决方案**:
|
||||
1. 严格遵守生命周期,在 `onDestroy()` 中调用 `off()`
|
||||
2. 对于临时组件,使用 `once()` 替代 `on()`
|
||||
3. 使用事件管理器批量管理事件的注册和移除
|
||||
|
||||
#### 事件命名冲突
|
||||
|
||||
**问题**:不同模块使用相同名称的事件导致意外行为。
|
||||
|
||||
**解决方案**:
|
||||
1. 使用模块前缀,如 `MAP_`、`HERO_`
|
||||
2. 在 `GameEvent` 枚举中统一管理所有事件名称
|
||||
3. 避免使用过于通用的名称
|
||||
|
||||
**Section sources**
|
||||
- [MessageManager.ts](file://extensions/oops-plugin-framework/assets/core/common/event/MessageManager.ts)
|
||||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts)
|
||||
684
.qoder/repowiki/zh/content/核心系统/初始化系统.md
Normal file
684
.qoder/repowiki/zh/content/核心系统/初始化系统.md
Normal file
@@ -0,0 +1,684 @@
|
||||
# 初始化系统
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [USAGE.md](file://assets/script/game/wx_clound_client_api/USAGE.md)
|
||||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js)
|
||||
- [config.json](file://assets/resources/config.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
游戏初始化系统是一个基于ECS架构的复杂初始化流程,负责在游戏启动时完成资源加载、数据初始化、界面显示和环境配置等关键任务。该系统采用异步队列机制确保各个初始化步骤按顺序执行,同时支持云端数据加载和本地调试两种模式。
|
||||
|
||||
初始化系统的核心目标是:
|
||||
- 提供流畅的游戏启动体验
|
||||
- 支持云端数据同步和本地调试
|
||||
- 实现模块化的初始化流程
|
||||
- 确保错误处理和性能优化
|
||||
|
||||
## 项目结构
|
||||
|
||||
初始化系统的主要文件组织结构如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "初始化模块"
|
||||
A[Initialize.ts<br/>主初始化类]
|
||||
B[LoadingViewComp.ts<br/>加载界面组件]
|
||||
end
|
||||
subgraph "云服务模块"
|
||||
C[WxCloudApi.ts<br/>微信云API封装]
|
||||
D[USAGE.md<br/>使用指南]
|
||||
end
|
||||
subgraph "共享模块"
|
||||
E[SingletonModuleComp.ts<br/>单例模块组件]
|
||||
end
|
||||
subgraph "配置文件"
|
||||
F[config.json<br/>配置信息]
|
||||
G[index.js<br/>云函数实现]
|
||||
end
|
||||
A --> B
|
||||
A --> C
|
||||
A --> E
|
||||
C --> G
|
||||
E --> C
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L207)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L1-L91)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L94)
|
||||
|
||||
**章节来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L207)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L1-L91)
|
||||
|
||||
## 核心组件
|
||||
|
||||
初始化系统由以下核心组件构成:
|
||||
|
||||
### Initialize 主初始化类
|
||||
负责协调整个初始化流程,包含四个主要阶段:
|
||||
- **loadCustom**: 加载自定义资源和字体
|
||||
- **loadLanguage**: 加载多语言包
|
||||
- **loadCommon**: 加载公共资源
|
||||
- **onComplete**: 完成初始化并显示加载界面
|
||||
|
||||
### LoadingViewComp 加载界面组件
|
||||
提供可视化的加载进度反馈,支持多语言提示和进度监控。
|
||||
|
||||
### WxCloudApi 微信云API
|
||||
封装微信云开发接口,提供登录、数据存储和获取功能。
|
||||
|
||||
### SingletonModuleComp 单例模块
|
||||
管理全局游戏数据和状态,处理云端数据同步。
|
||||
|
||||
**章节来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L20-L40)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L18-L35)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L8-L30)
|
||||
|
||||
## 架构概览
|
||||
|
||||
初始化系统采用基于ECS架构的设计模式,通过异步队列实现串行任务执行:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Game as 游戏引擎
|
||||
participant Init as Initialize
|
||||
participant Queue as AsyncQueue
|
||||
participant View as LoadingViewComp
|
||||
participant Cloud as WxCloudApi
|
||||
participant SMC as SingletonModuleComp
|
||||
Game->>Init : 创建Initialize实例
|
||||
Init->>Queue : 创建异步队列
|
||||
Init->>Queue : 添加loadCustom任务
|
||||
Init->>Queue : 添加loadLanguage任务
|
||||
Init->>Queue : 添加loadCommon任务
|
||||
Init->>Queue : 添加onComplete任务
|
||||
Init->>Queue : 执行queue.play()
|
||||
Queue->>Init : 执行loadCustom
|
||||
Init->>Init : 加载字体资源
|
||||
Init->>Init : 调用loadGameDataUnified
|
||||
alt 微信客户端
|
||||
Init->>Cloud : initWxCloudEnv()
|
||||
Init->>Cloud : WxCloudApi.login()
|
||||
Cloud-->>Init : 返回云端数据
|
||||
Init->>SMC : 更新本地数据
|
||||
else 非微信客户端
|
||||
Init->>Init : 使用本地调试数据
|
||||
end
|
||||
Queue->>Init : 执行loadLanguage
|
||||
Init->>Init : 设置默认语言
|
||||
Init->>Init : 加载语言包
|
||||
Queue->>Init : 执行loadCommon
|
||||
Init->>Init : 加载公共资源
|
||||
Queue->>View : 执行onComplete
|
||||
View->>View : 显示加载界面
|
||||
View->>View : 开始游戏资源加载
|
||||
Note over Game,SMC : 初始化流程完成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L25-L40)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L45-L65)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L37-L50)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Initialize 类详细分析
|
||||
|
||||
Initialize类是初始化系统的核心控制器,采用ECS实体模式设计:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Initialize {
|
||||
+LoadingViewComp LoadingView
|
||||
+init() void
|
||||
-loadCustom(queue : AsyncQueue) void
|
||||
-loadLanguage(queue : AsyncQueue) void
|
||||
-loadCommon(queue : AsyncQueue) void
|
||||
-onComplete(queue : AsyncQueue) void
|
||||
-loadGameDataUnified() Promise~void~
|
||||
-loadFromCloud() Promise~void~
|
||||
-loadFromLocalDebug() Promise~void~
|
||||
-initWxCloudEnv() void
|
||||
-isWxClient() boolean
|
||||
}
|
||||
class AsyncQueue {
|
||||
+push(task : Function) void
|
||||
+play() void
|
||||
+complete : Function
|
||||
}
|
||||
class LoadingViewComp {
|
||||
+data : Object
|
||||
+reset() void
|
||||
+start() void
|
||||
-loadRes() Promise~void~
|
||||
-loadCustom() void
|
||||
-loadGameRes() void
|
||||
-onProgressCallback() void
|
||||
-onCompleteCallback() void
|
||||
}
|
||||
Initialize --> AsyncQueue : 使用
|
||||
Initialize --> LoadingViewComp : 创建
|
||||
LoadingViewComp --> SingletonModuleComp : 通信
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L20-L40)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L18-L35)
|
||||
|
||||
#### 初始化流程详解
|
||||
|
||||
初始化过程分为四个关键阶段:
|
||||
|
||||
1. **loadCustom阶段**:加载自定义资源和字体
|
||||
- 加载多语言对应的字体资源
|
||||
- 调用统一数据加载流程
|
||||
- 错误处理:即使失败也继续执行
|
||||
|
||||
2. **loadLanguage阶段**:处理多语言支持
|
||||
- 检查并设置默认语言(zh)
|
||||
- 从本地存储读取语言偏好
|
||||
- 加载对应的语言包资源
|
||||
|
||||
3. **loadCommon阶段**:加载公共资源
|
||||
- 加载common目录下的所有资源
|
||||
- 包括游戏必需的基础资源
|
||||
|
||||
4. **onComplete阶段**:完成初始化
|
||||
- 注册UI回调函数
|
||||
- 打开加载界面
|
||||
- 准备进入游戏内容加载
|
||||
|
||||
**章节来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L42-L85)
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L107-L135)
|
||||
|
||||
### 加载界面组件分析
|
||||
|
||||
LoadingViewComp负责提供可视化的加载体验:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始加载] --> B[设置提示文本]
|
||||
B --> C[加载自定义资源]
|
||||
C --> D[加载游戏资源]
|
||||
D --> E{加载完成?}
|
||||
E --> |否| F[更新进度]
|
||||
F --> G[计算百分比]
|
||||
G --> H[更新UI显示]
|
||||
H --> E
|
||||
E --> |是| I[移除组件]
|
||||
I --> J[加载地图]
|
||||
J --> K[打开角色控制界面]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L50-L90)
|
||||
|
||||
#### 加载进度监控机制
|
||||
|
||||
加载界面通过以下机制实现实时进度反馈:
|
||||
|
||||
- **进度回调**:监听资源加载进度事件
|
||||
- **百分比计算**:实时计算并格式化进度百分比
|
||||
- **多语言支持**:根据当前语言显示相应提示
|
||||
- **资源释放**:加载完成后及时释放临时资源
|
||||
|
||||
**章节来源**
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L70-L90)
|
||||
|
||||
### 云端数据加载机制
|
||||
|
||||
初始化系统支持两种数据加载模式:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始数据加载] --> B{检测运行环境}
|
||||
B --> |微信客户端| C[使用云端数据]
|
||||
B --> |非微信客户端| D[使用本地调试数据]
|
||||
C --> E[初始化微信云环境]
|
||||
E --> F[调用WxCloudApi.login]
|
||||
F --> G{登录成功?}
|
||||
G --> |是| H[获取云端数据]
|
||||
G --> |否| I[使用本地数据]
|
||||
H --> J[更新本地数据]
|
||||
J --> K[覆盖游戏配置]
|
||||
D --> L[加载本地调试数据]
|
||||
L --> M[使用默认配置]
|
||||
I --> N[记录警告日志]
|
||||
M --> O[继续初始化]
|
||||
N --> O
|
||||
K --> O
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L107-L170)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L37-L50)
|
||||
|
||||
#### 微信云环境初始化
|
||||
|
||||
微信云环境的初始化过程包括:
|
||||
|
||||
1. **环境配置**:设置云环境ID
|
||||
2. **API初始化**:调用微信云SDK初始化
|
||||
3. **错误处理**:捕获并记录初始化异常
|
||||
|
||||
#### 用户登录流程
|
||||
|
||||
用户登录通过WxCloudApi.login()实现:
|
||||
|
||||
- **函数调用**:调用微信云函数`cocos_cloud`
|
||||
- **命令参数**:发送`cmd: "login"`指令
|
||||
- **数据验证**:检查返回结果的状态码
|
||||
- **数据覆盖**:成功时直接覆盖本地游戏数据
|
||||
|
||||
**章节来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L172-L206)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L10-L50)
|
||||
|
||||
### 单例模块组件
|
||||
|
||||
SingletonModuleComp作为全局状态管理器:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SingletonModuleComp {
|
||||
+initialize : Initialize
|
||||
+map : GameMap
|
||||
+openid : string
|
||||
+mission : Object
|
||||
+guides : Array
|
||||
+current_guide : number
|
||||
+data : Object
|
||||
+fight_hero : number
|
||||
+heros : Array
|
||||
+monsters : Array
|
||||
+vmdata : Object
|
||||
+vmAdd() void
|
||||
+reset() void
|
||||
+updateCloudData() Promise~boolean~
|
||||
+getCloudData() void
|
||||
+overrideLocalDataWithRemote() void
|
||||
+getGameDate() Object
|
||||
+addHero() boolean
|
||||
+updateFihgtHero() boolean
|
||||
+updateGold() boolean
|
||||
+error() void
|
||||
}
|
||||
class WxCloudApi {
|
||||
+init(env : string) void
|
||||
+login() Promise
|
||||
+save(gameData : any) Promise
|
||||
+get() Promise
|
||||
}
|
||||
SingletonModuleComp --> WxCloudApi : 使用
|
||||
SingletonModuleComp --> Initialize : 被引用
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L25-L60)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L8-L30)
|
||||
|
||||
**章节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L120-L159)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
初始化系统的依赖关系图展示了各组件间的交互:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
A[Cocos引擎]
|
||||
B[Oops框架]
|
||||
C[微信云开发]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
D[Initialize]
|
||||
E[LoadingViewComp]
|
||||
F[WxCloudApi]
|
||||
G[SingletonModuleComp]
|
||||
end
|
||||
subgraph "配置资源"
|
||||
H[config.json]
|
||||
I[语言包]
|
||||
J[游戏资源]
|
||||
end
|
||||
A --> D
|
||||
B --> D
|
||||
B --> E
|
||||
B --> G
|
||||
C --> F
|
||||
D --> E
|
||||
D --> F
|
||||
D --> G
|
||||
F --> G
|
||||
H --> D
|
||||
I --> D
|
||||
J --> D
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L15)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L1-L5)
|
||||
|
||||
### 组件耦合度分析
|
||||
|
||||
- **Initialize与LoadingViewComp**:松耦合,通过UI回调机制通信
|
||||
- **Initialize与WxCloudApi**:中等耦合,直接调用API方法
|
||||
- **SingletonModuleComp与其他组件**:高耦合,作为全局状态中心
|
||||
- **各组件与Oops框架**:强耦合,依赖框架提供的功能
|
||||
|
||||
**章节来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L15)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L10)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 异步队列调度优化
|
||||
|
||||
初始化系统采用异步队列机制确保任务按序执行,避免阻塞主线程:
|
||||
|
||||
- **串行执行**:每个任务完成后才执行下一个
|
||||
- **错误隔离**:单个任务失败不影响整体流程
|
||||
- **资源管理**:及时释放不需要的资源
|
||||
|
||||
### 资源预加载策略
|
||||
|
||||
- **字体预加载**:优先加载多语言字体
|
||||
- **公共资源缓存**:提前加载常用资源
|
||||
- **渐进式加载**:分阶段加载不同类型的资源
|
||||
|
||||
### 内存管理
|
||||
|
||||
- **及时释放**:加载完成后立即释放临时资源
|
||||
- **引用清理**:避免循环引用导致内存泄漏
|
||||
- **组件卸载**:完成初始化后移除不必要的组件
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 1. 云环境ID未配置
|
||||
|
||||
**症状**:微信客户端初始化失败,控制台显示云环境初始化错误
|
||||
|
||||
**原因**:WxCloudApi.init()中的cloudEnvId未正确设置
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 修改Initialize.ts中的initWxCloudEnv方法
|
||||
private initWxCloudEnv() {
|
||||
try {
|
||||
// 替换为您的实际云环境ID
|
||||
const cloudEnvId = "您的云环境ID"; // 必须配置
|
||||
WxCloudApi.init(cloudEnvId);
|
||||
console.log("[Initialize]: 微信云环境初始化完成");
|
||||
} catch (error) {
|
||||
console.error("[Initialize]: 微信云环境初始化失败:", error);
|
||||
// 提供降级方案
|
||||
this.useFallbackMode();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 语言包加载失败
|
||||
|
||||
**症状**:游戏界面显示英文或乱码
|
||||
|
||||
**原因**:语言包资源加载失败或语言文件损坏
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
private loadLanguage(queue: AsyncQueue) {
|
||||
queue.push((next: NextFunction, params: any, args: any) => {
|
||||
try {
|
||||
let lan = oops.storage.get("language");
|
||||
if (!lan || lan === "") {
|
||||
lan = "zh"; // 默认语言
|
||||
oops.storage.set("language", lan);
|
||||
}
|
||||
|
||||
// 添加语言包加载超时处理
|
||||
const timeout = setTimeout(() => {
|
||||
console.warn("[Initialize]: 语言包加载超时,使用默认语言");
|
||||
oops.language.setLanguage("zh", next);
|
||||
}, 5000);
|
||||
|
||||
oops.language.setLanguage(lan, () => {
|
||||
clearTimeout(timeout);
|
||||
next();
|
||||
});
|
||||
} catch (error) {
|
||||
console.error("[Initialize]: 语言包加载失败:", error);
|
||||
// 使用默认语言
|
||||
oops.language.setLanguage("zh", next);
|
||||
}
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 云端数据同步失败
|
||||
|
||||
**症状**:游戏数据无法从云端获取,使用默认数据
|
||||
|
||||
**原因**:网络问题或云端服务异常
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
private async loadFromCloud() {
|
||||
try {
|
||||
this.initWxCloudEnv();
|
||||
|
||||
// 添加重试机制
|
||||
let retryCount = 0;
|
||||
const maxRetries = 3;
|
||||
|
||||
while (retryCount < maxRetries) {
|
||||
try {
|
||||
const loginResult = await WxCloudApi.login();
|
||||
|
||||
if (loginResult.result.code === 200) {
|
||||
console.log("[Initialize]: 云端登录成功");
|
||||
this.overrideLocalDataWithRemote(loginResult.result.data);
|
||||
return;
|
||||
} else {
|
||||
console.warn(`[Initialize]: 云端登录失败,尝试次数 ${retryCount + 1}`);
|
||||
retryCount++;
|
||||
await this.delay(1000 * retryCount); // 指数退避
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("[Initialize]: 云端数据加载异常:", error);
|
||||
retryCount++;
|
||||
await this.delay(1000 * retryCount);
|
||||
}
|
||||
}
|
||||
|
||||
// 最终使用本地数据
|
||||
console.warn("[Initialize]: 云端数据加载多次失败,使用本地数据");
|
||||
this.useLocalDataFallback();
|
||||
|
||||
} catch (error) {
|
||||
console.error("[Initialize]: 云端数据加载最终失败:", error);
|
||||
this.useLocalDataFallback();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. 加载界面显示异常
|
||||
|
||||
**症状**:加载进度不更新或界面显示错误
|
||||
|
||||
**原因**:LoadingViewComp组件初始化失败或数据绑定问题
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
private onComplete(queue: AsyncQueue) {
|
||||
queue.complete = () => {
|
||||
try {
|
||||
var uic: UICallbacks = {
|
||||
onAdded: (node: Node, params: any) => {
|
||||
try {
|
||||
var comp = node.getComponent(LoadingViewComp) as ecs.Comp;
|
||||
if (comp) {
|
||||
this.add(comp);
|
||||
console.log("[Initialize]: 加载界面组件添加成功");
|
||||
} else {
|
||||
console.error("[Initialize]: 加载界面组件获取失败");
|
||||
this.useAlternativeLoading();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("[Initialize]: 加载界面组件处理异常:", error);
|
||||
this.useAlternativeLoading();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 界面管理 - 打开游戏内容资源加载进度提示界面
|
||||
oops.gui.open(UIID.Loading, null, uic);
|
||||
} catch (error) {
|
||||
console.error("[Initialize]: 加载界面打开失败:", error);
|
||||
this.useAlternativeLoading();
|
||||
}
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 性能优化建议
|
||||
|
||||
#### 1. 资源预加载优化
|
||||
|
||||
```typescript
|
||||
// 在初始化早期阶段预加载关键资源
|
||||
private preloadCriticalResources(queue: AsyncQueue) {
|
||||
queue.push((next: NextFunction, params: any, args: any) => {
|
||||
// 预加载关键字体和UI资源
|
||||
const criticalResources = [
|
||||
"language/font/zh",
|
||||
"common/ui/loading",
|
||||
"common/audio/bgm"
|
||||
];
|
||||
|
||||
let loaded = 0;
|
||||
const total = criticalResources.length;
|
||||
|
||||
criticalResources.forEach(resource => {
|
||||
oops.res.load(resource, () => {
|
||||
loaded++;
|
||||
if (loaded === total) {
|
||||
next();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 并行加载优化
|
||||
|
||||
```typescript
|
||||
// 对于独立的资源组,可以考虑并行加载
|
||||
private loadResourcesParallel(queue: AsyncQueue) {
|
||||
queue.push((next: NextFunction, params: any, args: any) => {
|
||||
// 并行加载多个资源组
|
||||
const groups = [
|
||||
{ name: "fonts", path: "language/font" },
|
||||
{ name: "ui", path: "common/ui" },
|
||||
{ name: "audio", path: "common/audio" }
|
||||
];
|
||||
|
||||
let completed = 0;
|
||||
const total = groups.length;
|
||||
|
||||
groups.forEach(group => {
|
||||
oops.res.loadDir(group.path, () => {
|
||||
console.log(`[${group.name}] 资源加载完成`);
|
||||
completed++;
|
||||
if (completed === total) {
|
||||
next();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 内存使用监控
|
||||
|
||||
```typescript
|
||||
// 添加内存使用监控
|
||||
private monitorMemoryUsage() {
|
||||
setInterval(() => {
|
||||
if (typeof performance !== 'undefined' && performance.memory) {
|
||||
const memory = performance.memory;
|
||||
console.log(`内存使用情况:
|
||||
已用: ${(memory.usedJSHeapSize / 1024 / 1024).toFixed(2)}MB
|
||||
总计: ${(memory.totalJSHeapSize / 1024 / 1024).toFixed(2)}MB
|
||||
限制: ${(memory.jsHeapSizeLimit / 1024 / 1024).toFixed(2)}MB`);
|
||||
|
||||
// 如果内存使用过高,触发垃圾回收
|
||||
if (memory.usedJSHeapSize > memory.jsHeapSizeLimit * 0.8) {
|
||||
console.warn("内存使用过高,触发垃圾回收");
|
||||
if (typeof global !== 'undefined') {
|
||||
global.gc && global.gc();
|
||||
}
|
||||
}
|
||||
}
|
||||
}, 5000);
|
||||
}
|
||||
```
|
||||
|
||||
## 结论
|
||||
|
||||
游戏初始化系统是一个设计精良的模块化架构,通过ECS模式实现了高度解耦和可扩展性。系统的主要优势包括:
|
||||
|
||||
### 技术优势
|
||||
|
||||
1. **模块化设计**:每个初始化阶段职责明确,便于维护和扩展
|
||||
2. **异步处理**:采用异步队列确保流畅的用户体验
|
||||
3. **环境适配**:支持云端和本地两种运行环境
|
||||
4. **错误恢复**:完善的错误处理和降级机制
|
||||
|
||||
### 架构特点
|
||||
|
||||
1. **ECS集成**:充分利用ECS架构的优势
|
||||
2. **组件化**:清晰的组件边界和职责划分
|
||||
3. **事件驱动**:基于事件的松耦合通信
|
||||
4. **状态管理**:集中式的全局状态管理
|
||||
|
||||
### 性能特性
|
||||
|
||||
1. **渐进式加载**:分阶段加载减少首屏时间
|
||||
2. **资源优化**:智能的资源管理和释放
|
||||
3. **内存控制**:有效的内存使用和垃圾回收
|
||||
4. **并发处理**:合理的并行加载策略
|
||||
|
||||
### 扩展性
|
||||
|
||||
系统设计充分考虑了未来的扩展需求,可以通过以下方式轻松扩展:
|
||||
|
||||
- **新增初始化阶段**:通过AsyncQueue.push()添加新任务
|
||||
- **自定义加载逻辑**:继承或组合现有组件
|
||||
- **多环境支持**:通过条件判断支持更多运行环境
|
||||
- **插件化架构**:支持第三方插件集成
|
||||
|
||||
初始化系统为游戏开发提供了坚实的基础架构,确保了游戏能够稳定、高效地启动,并为后续的功能扩展奠定了良好的基础。
|
||||
253
.qoder/repowiki/zh/content/核心系统/数据存储系统.md
Normal file
253
.qoder/repowiki/zh/content/核心系统/数据存储系统.md
Normal file
@@ -0,0 +1,253 @@
|
||||
# 数据存储系统
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [storage.md](file://doc/core/common/storage.md)
|
||||
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts)
|
||||
- [config.json](file://assets/resources/config.json)
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts)
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts)
|
||||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [本地数据持久化机制](#本地数据持久化机制)
|
||||
2. [初始化与用户数据区分](#初始化与用户数据区分)
|
||||
3. [基本操作方法](#基本操作方法)
|
||||
4. [调试与发布模式差异](#调试与发布模式差异)
|
||||
5. [数据安全策略](#数据安全策略)
|
||||
6. [存储需求与应用示例](#存储需求与应用示例)
|
||||
7. [异常处理与最佳实践](#异常处理与最佳实践)
|
||||
8. [跨设备同步与本地缓存](#跨设备同步与本地缓存)
|
||||
|
||||
## 本地数据持久化机制
|
||||
|
||||
本游戏项目采用Oops Framework提供的本地存储模块,该模块封装了Cocos Creator引擎的`sys.localStorage`对象,实现了跨平台的本地数据存储功能。存储系统不仅支持基础的增删改查操作,还集成了数据加密和多用户数据区分功能,确保玩家数据的安全性和独立性。
|
||||
|
||||
系统通过`oops.storage`接口提供统一的数据访问方法,所有数据最终存储在设备本地,同时支持与云端数据同步的混合存储策略。本地存储主要用于保存玩家配置、语言设置、游戏进度等关键数据,确保即使在离线状态下也能正常访问游戏内容。
|
||||
|
||||
**Section sources**
|
||||
- [storage.md](file://doc/core/common/storage.md#L1-L38)
|
||||
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts#L57)
|
||||
|
||||
## 初始化与用户数据区分
|
||||
|
||||
### 初始化本地存储加密
|
||||
|
||||
本地存储加密通过`oops.storage.init()`方法进行初始化,该方法需要传入加密密钥和初始化向量(IV)两个参数。在项目启动时,系统会从配置文件中读取加密参数并完成初始化。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 游戏启动
|
||||
participant Root组件
|
||||
participant 存储系统
|
||||
participant 配置文件
|
||||
游戏启动->>Root组件 : onLoad()
|
||||
Root组件->>配置文件 : 加载config.json
|
||||
配置文件-->>Root组件 : 返回配置数据
|
||||
Root组件->>存储系统 : oops.storage.init(key, vi)
|
||||
存储系统-->>Root组件 : 初始化完成
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts#L57)
|
||||
- [config.json](file://assets/resources/config.json#L1-L20)
|
||||
|
||||
### 区分用户数据
|
||||
|
||||
通过`oops.storage.setUser()`方法可以为不同用户设置唯一标识,从而实现多账号数据隔离。系统使用用户ID作为数据存储的命名空间,避免不同账号之间的数据覆盖问题。
|
||||
|
||||
当用户登录时,系统会调用此方法设置当前用户ID,后续的所有数据操作都将基于该用户ID进行。这对于支持多账号切换的游戏尤为重要,确保每个玩家的游戏进度和设置都能独立保存。
|
||||
|
||||
**Section sources**
|
||||
- [storage.md](file://doc/core/common/storage.md#L10-L15)
|
||||
|
||||
## 基本操作方法
|
||||
|
||||
本地存储系统提供了一套完整的数据操作API,包括设置、获取、删除和清空等基本操作。
|
||||
|
||||
### 设置数据
|
||||
|
||||
使用`oops.storage.set(key, value)`方法可以将指定键值对保存到本地存储中。该方法接受两个参数:键名和值。值可以是字符串、数字、布尔值或对象等数据类型。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始] --> B["oops.storage.set(key, value)"]
|
||||
B --> C{数据类型检查}
|
||||
C --> |基本类型| D[直接存储]
|
||||
C --> |对象类型| E[JSON序列化]
|
||||
E --> F[加密处理]
|
||||
F --> G[保存到localStorage]
|
||||
G --> H[结束]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [storage.md](file://doc/core/common/storage.md#L20-L22)
|
||||
|
||||
### 获取数据
|
||||
|
||||
通过`oops.storage.get(key)`方法可以从本地存储中读取指定键的数据。如果键不存在,则返回null。该方法会自动处理数据的解密和反序列化过程,向调用者返回原始数据类型。
|
||||
|
||||
### 删除数据
|
||||
|
||||
`oops.storage.remove(key)`方法用于删除指定键的数据。执行后,该键对应的数据将从本地存储中永久移除。
|
||||
|
||||
### 清空存储
|
||||
|
||||
`oops.storage.clear()`方法会清空当前用户的所有本地存储数据。这是一个危险操作,通常只在用户注销或重置游戏时使用。
|
||||
|
||||
**Section sources**
|
||||
- [storage.md](file://doc/core/common/storage.md#L24-L38)
|
||||
|
||||
## 调试与发布模式差异
|
||||
|
||||
本地存储系统在调试模式和发布模式下表现出不同的行为特征,这是为了平衡开发效率和生产环境安全性的设计。
|
||||
|
||||
### 调试模式
|
||||
|
||||
在调试模式下,系统不会对存储数据进行加密,所有数据以明文形式保存。这一设计便于开发者调试时直接查看和修改存储内容,提高了开发效率。开发者可以通过浏览器的开发者工具直接查看`localStorage`中的数据内容。
|
||||
|
||||
### 发布模式
|
||||
|
||||
在发布模式下,系统会自动启用数据加密功能。所有写入本地存储的数据都会经过加密处理,读取时再进行解密。这种机制有效防止了玩家通过直接修改存储文件来作弊的行为,保护了游戏的公平性。
|
||||
|
||||
加密算法基于项目配置文件中定义的密钥和IV参数,确保了加密过程的一致性和安全性。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[数据操作] --> B{运行模式}
|
||||
B --> |调试模式| C[明文存储]
|
||||
B --> |发布模式| D[加密存储]
|
||||
C --> E[便于调试]
|
||||
D --> F[防止篡改]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [storage.md](file://doc/core/common/storage.md#L10-L15)
|
||||
- [Root.ts](file://extensions/oops-plugin-framework/assets/core/Root.ts#L57)
|
||||
|
||||
## 数据安全策略
|
||||
|
||||
### 加密机制
|
||||
|
||||
系统采用对称加密算法保护本地存储数据,加密密钥和IV参数定义在`assets/resources/config.json`配置文件中。这种集中管理的方式便于统一维护和更新加密参数。
|
||||
|
||||
项目依赖`crypto-es`库实现加密功能,这是一个轻量级的JavaScript加密库,支持多种加密算法。通过在`package.json`中声明依赖,确保了加密库的版本一致性。
|
||||
|
||||
### 防篡改机制
|
||||
|
||||
除了数据加密外,系统还通过用户ID区分机制防止数据篡改。每个用户的数据都有独立的存储空间,避免了通过修改用户ID来访问他人数据的可能性。
|
||||
|
||||
对于关键数据,系统建议采用双重保护策略:既在本地加密存储,又在云端备份。当检测到本地数据异常时,可以从云端恢复,确保玩家数据不丢失。
|
||||
|
||||
**Section sources**
|
||||
- [config.json](file://assets/resources/config.json#L1-L20)
|
||||
- [package.json](file://package.json#L1-L11)
|
||||
|
||||
## 存储需求与应用示例
|
||||
|
||||
### 碰撞分组配置存储
|
||||
|
||||
`BoxSet.ts`文件定义了游戏中的碰撞分组配置,这些配置数据可以通过本地存储系统进行持久化保存。玩家可以自定义碰撞规则,系统将这些设置保存到本地,确保每次启动游戏时都能恢复个性化配置。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class BoxSet {
|
||||
+SKILL_TAG : number
|
||||
+ATK_RANGE : number
|
||||
+DEFAULT : number
|
||||
+MONSTER : number
|
||||
+HERO : number
|
||||
+PLAYER : number
|
||||
+BOSS : number
|
||||
+BOX_WIDTH : number
|
||||
+BOX_HEIGHT : number
|
||||
}
|
||||
class StorageManager {
|
||||
+setCollisionConfig(config)
|
||||
+getCollisionConfig()
|
||||
+saveToLocalStorage()
|
||||
+loadFromLocalStorage()
|
||||
}
|
||||
StorageManager --> BoxSet : "使用"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L1-L108)
|
||||
- [storage.md](file://doc/core/common/storage.md#L20-L22)
|
||||
|
||||
### 游戏进度管理
|
||||
|
||||
系统通过`SingletonModuleComp.ts`管理游戏核心数据,包括玩家金币、英雄列表和出战阵容等。这些数据在游戏运行时存储在内存中,同时定期同步到本地存储。
|
||||
|
||||
当玩家完成游戏或退出应用时,系统会自动保存当前进度。下次启动游戏时,先从本地存储加载数据,再根据需要从云端同步最新状态,实现了本地与云端的数据一致性。
|
||||
|
||||
**Section sources**
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L1-L108)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L41)
|
||||
|
||||
## 异常处理与最佳实践
|
||||
|
||||
### 数据序列化
|
||||
|
||||
在存储复杂数据类型时,需要先进行序列化处理。系统推荐使用`JSON.stringify()`将对象转换为字符串,然后再调用存储方法。读取数据时,使用`JSON.parse()`进行反序列化。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[原始数据] --> B[JSON.stringify]
|
||||
B --> C[加密]
|
||||
C --> D[存储]
|
||||
D --> E[读取]
|
||||
E --> F[解密]
|
||||
F --> G[JSON.parse]
|
||||
G --> H[恢复数据]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L105-L139)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L119-L159)
|
||||
|
||||
### 异常处理
|
||||
|
||||
在进行数据操作时,必须考虑各种异常情况,如存储空间不足、数据损坏、加密失败等。系统建议采用try-catch结构包裹存储操作,并提供相应的错误处理机制。
|
||||
|
||||
对于关键数据的保存操作,建议实现事务性处理:先写入临时位置,验证成功后再替换原数据,确保数据完整性。
|
||||
|
||||
**Section sources**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L105-L139)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L81-L121)
|
||||
|
||||
## 跨设备同步与本地缓存
|
||||
|
||||
### 云端同步机制
|
||||
|
||||
系统实现了本地存储与微信云开发的集成,通过`WxCloudApi.ts`提供的接口实现数据云端同步。在微信客户端环境下,游戏启动时会自动从云端加载最新数据;在非微信环境下,则使用本地调试数据。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant 客户端
|
||||
participant 云端
|
||||
participant 本地存储
|
||||
客户端->>云端 : login()
|
||||
云端-->>客户端 : 用户数据
|
||||
客户端->>本地存储 : 保存云端数据
|
||||
本地存储-->>客户端 : 确认
|
||||
客户端->>云端 : save(gameData)
|
||||
云端-->>客户端 : 保存结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [WxCloudApi.ts](file://assets/script/game/wx_clound_client_api/WxCloudApi.ts#L0-L93)
|
||||
- [index.js](file://build-templates/wechatgame/cloud_functions/cocos_cloud/index.js#L0-L53)
|
||||
|
||||
### 本地缓存协调
|
||||
|
||||
系统采用"本地优先,云端同步"的策略。日常游戏过程中主要使用本地存储,定期或在关键节点将数据同步到云端。这样既保证了游戏性能,又实现了数据备份。
|
||||
|
||||
当玩家在不同设备上登录同一账号时,系统会优先使用云端最新数据,然后与本地数据进行合并,确保游戏进度的一致性。对于冲突数据,采用"最后写入获胜"的策略。
|
||||
|
||||
**Section sources**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L105-L139)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L81-L121)
|
||||
420
.qoder/repowiki/zh/content/核心系统/核心系统.md
Normal file
420
.qoder/repowiki/zh/content/核心系统/核心系统.md
Normal file
@@ -0,0 +1,420 @@
|
||||
# 核心系统
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
|
||||
- [Main.ts](file://assets/script/Main.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [event.md](file://doc/core/common/event.md)
|
||||
- [loader.md](file://doc/core/common/loader.md)
|
||||
- [storage.md](file://doc/core/common/storage.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目架构概览](#项目架构概览)
|
||||
3. [初始化系统](#初始化系统)
|
||||
4. [事件系统](#事件系统)
|
||||
5. [资源加载系统](#资源加载系统)
|
||||
6. [本地存储系统](#本地存储系统)
|
||||
7. [碰撞分组配置](#碰撞分组配置)
|
||||
8. [系统集成与工作流程](#系统集成与工作流程)
|
||||
9. [最佳实践与优化建议](#最佳实践与优化建议)
|
||||
10. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
|
||||
本游戏采用基于Oops Framework的模块化架构,核心运行系统包含初始化流程、事件系统、资源加载与本地存储四大核心模块。系统通过异步队列管理初始化顺序,使用事件总线实现模块间解耦,采用分层资源管理模式,并提供安全可靠的本地存储机制。
|
||||
|
||||
## 项目架构概览
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "游戏入口"
|
||||
Main[Main.ts]
|
||||
Root[Root基类]
|
||||
end
|
||||
subgraph "初始化系统"
|
||||
Init[Initialize.ts]
|
||||
Loading[LoadingViewComp.ts]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
SMC[SingletonModuleComp]
|
||||
Event[GameEvent.ts]
|
||||
Box[BoxSet.ts]
|
||||
end
|
||||
subgraph "资源管理"
|
||||
ResMgr[资源加载器]
|
||||
Storage[本地存储]
|
||||
Loader[异步队列]
|
||||
end
|
||||
subgraph "游戏内容"
|
||||
Map[GameMap]
|
||||
Scene[场景管理]
|
||||
end
|
||||
Main --> Init
|
||||
Init --> Loading
|
||||
Init --> SMC
|
||||
Loading --> Map
|
||||
SMC --> Event
|
||||
SMC --> Storage
|
||||
Init --> ResMgr
|
||||
ResMgr --> Loader
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Main.ts](file://assets/script/Main.ts#L1-L41)
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L207)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L1-L91)
|
||||
|
||||
## 初始化系统
|
||||
|
||||
### Initialize.ts - 游戏启动核心
|
||||
|
||||
Initialize.ts作为游戏初始化的核心模块,负责管理整个启动流程,采用异步队列模式确保资源按序加载。
|
||||
|
||||
#### 初始化流程架构
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Main as Main.ts
|
||||
participant Init as Initialize
|
||||
participant Queue as AsyncQueue
|
||||
participant Loading as LoadingViewComp
|
||||
participant SMC as SingletonModuleComp
|
||||
Main->>Init : 创建Initialize实体
|
||||
Init->>Queue : 创建异步队列
|
||||
Init->>Queue : 添加loadCustom任务
|
||||
Init->>Queue : 添加loadLanguage任务
|
||||
Init->>Queue : 添加loadCommon任务
|
||||
Init->>Queue : 添加onComplete回调
|
||||
Queue->>Queue : 执行队列任务
|
||||
Queue->>Loading : 打开加载界面
|
||||
Loading->>SMC : 初始化游戏数据
|
||||
Loading->>SMC : 加载地图资源
|
||||
SMC->>SMC : 完成初始化
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L25-L40)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L75-L91)
|
||||
|
||||
#### 核心初始化步骤
|
||||
|
||||
1. **自定义内容加载**:支持动态加载多语言字体和游戏配置
|
||||
2. **语言包加载**:自动检测并设置默认语言
|
||||
3. **公共资源加载**:加载游戏必需的基础资源
|
||||
4. **加载界面显示**:展示资源加载进度
|
||||
|
||||
#### 微信客户端适配
|
||||
|
||||
系统具备智能客户端识别能力,能够根据运行环境选择不同的数据加载策略:
|
||||
|
||||
- **微信客户端**:连接云端数据库,实现数据实时同步
|
||||
- **本地调试**:使用本地预设数据,便于开发调试
|
||||
|
||||
**章节来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L42-L207)
|
||||
|
||||
### LoadingViewComp.ts - 启动画面交互
|
||||
|
||||
LoadingViewComp负责管理游戏启动过程中的视觉反馈和用户体验。
|
||||
|
||||
#### 加载状态管理
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 初始化
|
||||
初始化 --> 加载自定义资源 : loadCustom()
|
||||
加载自定义资源 --> 加载游戏资源 : loadGameRes()
|
||||
加载游戏资源 --> 加载完成 : onCompleteCallback()
|
||||
加载完成 --> 销毁组件 : remove(LoadingViewComp)
|
||||
销毁组件 --> [*]
|
||||
加载自定义资源 : 显示"加载JSON数据"
|
||||
加载游戏资源 : 显示"加载游戏内容"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L50-L91)
|
||||
|
||||
#### 进度监控机制
|
||||
|
||||
系统提供实时的资源加载进度监控,包括:
|
||||
- 当前完成数量
|
||||
- 总资源数量
|
||||
- 进度百分比计算
|
||||
- 多语言提示文本更新
|
||||
|
||||
**章节来源**
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L1-L91)
|
||||
|
||||
## 事件系统
|
||||
|
||||
### GameEvent.ts - 事件枚举定义
|
||||
|
||||
GameEvent.ts定义了游戏中的所有自定义事件类型,采用枚举方式组织,确保事件名称的一致性和可维护性。
|
||||
|
||||
#### 事件分类体系
|
||||
|
||||
| 事件类别 | 事件名称 | 描述 |
|
||||
|---------|---------|------|
|
||||
| 游戏连接 | GameServerConnected | 游戏服务器连接成功 |
|
||||
| 登录认证 | LoginSuccess | 登录成功事件 |
|
||||
| 地图移动 | MAP_MOVE_END_LEFT/RIGHT | 地图移动结束事件 |
|
||||
| 引导系统 | GuideStart/End/Complete | 引导流程控制事件 |
|
||||
| 英雄系统 | UpdateHero/UpdateFightHero | 英雄数据更新事件 |
|
||||
| 技能系统 | CastSkill/CastHeroSkill | 技能释放事件 |
|
||||
| 战斗系统 | FightStart/Pause/Resume/End | 战斗状态控制事件 |
|
||||
| 资源更新 | GOLD_UPDATE/DIAMOND_UPDATE/MEAT_UPDATE | 资源变化事件 |
|
||||
|
||||
#### 事件总线使用模式
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[事件发布者] --> B[oops.message.on/once]
|
||||
B --> C[事件监听器]
|
||||
C --> D[业务逻辑处理]
|
||||
D --> E[事件响应完成]
|
||||
F[事件取消] --> G[oops.message.off]
|
||||
G --> H[移除监听器]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
|
||||
- [event.md](file://doc/core/common/event.md#L1-L44)
|
||||
|
||||
### 事件系统最佳实践
|
||||
|
||||
1. **持续监听**:适用于长期关注的事件
|
||||
2. **一次性监听**:适用于仅需响应一次的事件
|
||||
3. **内存管理**:及时取消不再需要的事件监听
|
||||
|
||||
**章节来源**
|
||||
- [event.md](file://doc/core/common/event.md#L1-L44)
|
||||
|
||||
## 资源加载系统
|
||||
|
||||
### loader.md - 资源管理最佳实践
|
||||
|
||||
系统提供了完整的资源管理解决方案,涵盖从加载到释放的全生命周期管理。
|
||||
|
||||
#### 资源加载模式
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "资源类型"
|
||||
A[单个资源]
|
||||
B[资源文件夹]
|
||||
C[远程资源]
|
||||
D[Bundle资源]
|
||||
end
|
||||
subgraph "加载方式"
|
||||
E[同步加载]
|
||||
F[异步加载]
|
||||
G[进度回调]
|
||||
H[完成回调]
|
||||
end
|
||||
A --> E
|
||||
B --> F
|
||||
C --> G
|
||||
D --> H
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [loader.md](file://doc/core/common/loader.md#L1-L91)
|
||||
|
||||
#### 核心API功能
|
||||
|
||||
1. **远程资源加载**:支持网络图片和音频资源
|
||||
2. **Bundle管理**:支持多资源包的版本控制
|
||||
3. **进度监控**:提供实时加载进度反馈
|
||||
4. **资源释放**:自动清理无用资源,优化内存使用
|
||||
|
||||
#### 异步加载队列
|
||||
|
||||
系统采用AsyncQueue实现资源加载的有序执行,确保关键资源优先加载,提升用户体验。
|
||||
|
||||
**章节来源**
|
||||
- [loader.md](file://doc/core/common/loader.md#L1-L91)
|
||||
|
||||
## 本地存储系统
|
||||
|
||||
### storage.md - 数据持久化机制
|
||||
|
||||
本地存储系统提供安全可靠的数据持久化解决方案,支持数据加密和多用户隔离。
|
||||
|
||||
#### 存储架构设计
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "存储层次"
|
||||
A[应用层API]
|
||||
B[加密层]
|
||||
C[平台层]
|
||||
end
|
||||
subgraph "存储介质"
|
||||
D[Web Storage]
|
||||
E[IndexedDB]
|
||||
F[File System]
|
||||
end
|
||||
A --> B
|
||||
B --> C
|
||||
C --> D
|
||||
C --> E
|
||||
C --> F
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [storage.md](file://doc/core/common/storage.md#L1-L39)
|
||||
|
||||
#### 核心功能特性
|
||||
|
||||
1. **数据加密**:发布模式自动启用数据加密
|
||||
2. **用户隔离**:支持多用户账号数据分离
|
||||
3. **跨平台兼容**:统一的API接口适配不同平台
|
||||
4. **类型安全**:支持多种数据类型的序列化存储
|
||||
|
||||
#### 数据操作示例
|
||||
|
||||
| 操作类型 | API方法 | 功能描述 |
|
||||
|---------|---------|----------|
|
||||
| 初始化 | `oops.storage.init(key, vi)` | 设置加密密钥 |
|
||||
| 用户设置 | `oops.storage.setUser(uid)` | 设置用户标识 |
|
||||
| 数据存储 | `oops.storage.set(key, value)` | 保存数据 |
|
||||
| 数据读取 | `oops.storage.get(key)` | 获取数据 |
|
||||
| 数据删除 | `oops.storage.remove(key)` | 删除数据 |
|
||||
| 清空存储 | `oops.storage.clear()` | 清空所有数据 |
|
||||
|
||||
**章节来源**
|
||||
- [storage.md](file://doc/core/common/storage.md#L1-L39)
|
||||
|
||||
## 碰撞分组配置
|
||||
|
||||
### BoxSet.ts - 物理碰撞系统
|
||||
|
||||
BoxSet.ts定义了游戏中的物理碰撞分组,为2D物理引擎提供精确的碰撞检测规则。
|
||||
|
||||
#### 碰撞分组体系
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "角色分组"
|
||||
A[HERO - 英雄]
|
||||
B[MONSTER - 怪物]
|
||||
C[BOSS - BOSS]
|
||||
D[PLAYER - 玩家]
|
||||
end
|
||||
subgraph "技能分组"
|
||||
E[HERO_SKILL - 英雄技能]
|
||||
F[MONSTER_SKILL - 怪物技能]
|
||||
G[SKILL_TAG - 技能标记]
|
||||
end
|
||||
subgraph "范围分组"
|
||||
H[ATK_RANGE - 攻击范围]
|
||||
I[DEFAULT - 默认分组]
|
||||
end
|
||||
A --> E
|
||||
B --> F
|
||||
C --> F
|
||||
D --> E
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L1-L109)
|
||||
|
||||
#### 配置参数详解
|
||||
|
||||
| 参数类别 | 参数名称 | 数值 | 用途 |
|
||||
|---------|---------|------|------|
|
||||
| 分组掩码 | DEFAULT | 1 | 默认碰撞分组 |
|
||||
| 分组掩码 | MONSTER | 2 | 怪物专用分组 |
|
||||
| 分组掩码 | HERO | 4 | 英雄专用分组 |
|
||||
| 分组掩码 | MONSTER_SKILL | 8 | 怪物技能分组 |
|
||||
| 分组掩码 | HERO_SKILL | 16 | 英雄技能分组 |
|
||||
| 分组掩码 | PLAYER | 32 | 玩家区域分组 |
|
||||
| 分组掩码 | BOSS | 64 | BOSS专用分组 |
|
||||
| 地图边界 | LETF_END | -420 | 左边界坐标 |
|
||||
| 地图边界 | RIGHT_END | 420 | 右边界坐标 |
|
||||
| 地图边界 | HERO_START | -360 | 英雄起始位置 |
|
||||
| 地图边界 | MONSTER_START | 360 | 怪物起始位置 |
|
||||
| 攻击范围 | ATK_RANGE_X | 150 | 攻击距离X轴 |
|
||||
| 移动范围 | MOVE_RANGE_X | 20 | 移动范围X轴 |
|
||||
|
||||
**章节来源**
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L1-L109)
|
||||
|
||||
## 系统集成与工作流程
|
||||
|
||||
### 整体工作流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[Main.ts启动] --> B[Root初始化]
|
||||
B --> C[SMC单例创建]
|
||||
C --> D[Initialize初始化]
|
||||
D --> E[AsyncQueue执行]
|
||||
E --> F[资源加载]
|
||||
F --> G[LoadingView显示]
|
||||
G --> H[数据初始化]
|
||||
H --> I[地图加载]
|
||||
I --> J[游戏界面打开]
|
||||
K[事件系统] --> L[GameEvent监听]
|
||||
L --> M[业务逻辑处理]
|
||||
N[存储系统] --> O[本地数据读取]
|
||||
O --> P[云端数据同步]
|
||||
Q[资源系统] --> R[异步加载队列]
|
||||
R --> S[进度监控]
|
||||
S --> T[资源释放]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Main.ts](file://assets/script/Main.ts#L1-L41)
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L1-L207)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L194)
|
||||
|
||||
### 数据流管理
|
||||
|
||||
系统采用单例模式管理全局状态,通过事件驱动实现模块间的松耦合通信。
|
||||
|
||||
**章节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L194)
|
||||
|
||||
## 最佳实践与优化建议
|
||||
|
||||
### 初始化优化策略
|
||||
|
||||
1. **并行加载**:利用异步队列实现资源的并行加载
|
||||
2. **错误处理**:对加载失败的资源进行优雅降级
|
||||
3. **进度反馈**:提供详细的加载进度和状态提示
|
||||
4. **内存管理**:及时释放不需要的资源
|
||||
|
||||
### 事件系统优化
|
||||
|
||||
1. **命名规范**:使用语义化的事件名称
|
||||
2. **监听管理**:及时移除不需要的事件监听器
|
||||
3. **参数传递**:合理设计事件参数结构
|
||||
4. **性能考虑**:避免在高频事件中执行复杂操作
|
||||
|
||||
### 资源管理最佳实践
|
||||
|
||||
1. **预加载策略**:提前加载常用资源
|
||||
2. **按需加载**:根据游戏进度动态加载资源
|
||||
3. **缓存管理**:合理利用资源缓存机制
|
||||
4. **内存监控**:定期检查和释放内存占用
|
||||
|
||||
### 存储系统安全
|
||||
|
||||
1. **数据加密**:在生产环境中启用数据加密
|
||||
2. **用户隔离**:确保不同用户的存储数据相互独立
|
||||
3. **备份策略**:建立数据备份和恢复机制
|
||||
4. **权限控制**:限制对敏感数据的访问权限
|
||||
|
||||
## 总结
|
||||
|
||||
本游戏的核心运行系统通过模块化设计实现了高度的可维护性和扩展性。初始化系统确保游戏启动的稳定性和效率,事件系统提供了灵活的模块间通信机制,资源管理系统支持复杂的资源加载和管理需求,本地存储系统保障了数据的安全性和持久性。
|
||||
|
||||
系统采用的异步队列模式、事件驱动架构和单例管理模式,为游戏开发提供了坚实的基础框架。通过合理的配置和优化,这套系统能够支持大型游戏项目的开发需求,同时保持良好的性能表现和用户体验。
|
||||
1602
.qoder/repowiki/zh/content/核心系统/资源加载系统.md
Normal file
1602
.qoder/repowiki/zh/content/核心系统/资源加载系统.md
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user