72 lines
2.8 KiB
Markdown
72 lines
2.8 KiB
Markdown
# 属性变更脏标签优化方案
|
||
|
||
## 一、现有实现存在的具体问题
|
||
|
||
### 1.1 性能问题
|
||
- **HeroViewComp.ts** 的 `update(dt: number)` 方法中,每帧都调用 `hp_show()` 和 `mp_show()`
|
||
- 即使血量和魔法值没有变化,也会每帧更新UI进度条,造成不必要的性能开销
|
||
- 缺少属性变更标记机制,采用轮询方式检查
|
||
|
||
### 1.2 架构问题
|
||
- 属性变更与UI更新耦合在 `update` 循环中,违反按需更新原则
|
||
- UI更新逻辑分散,缺少统一的变更标记管理
|
||
- 属性变更通知机制不完善
|
||
|
||
## 二、需要进行的修改方案
|
||
|
||
### 2.1 核心设计
|
||
- 采用脏标签(Dirty Flag)模式,属性变更时标记对应的脏标签
|
||
- UI层在 `update` 中检查脏标签,只在属性变化时更新显示
|
||
- 解耦数据层和视图层,提升性能和可维护性
|
||
|
||
### 2.2 实现步骤
|
||
1. **添加脏标签标记**:在 `HeroAttrsComp` 中添加血量、魔法值、护盾的脏标签
|
||
2. **修改属性变更方法**:在 `HeroAttrsComp` 的属性变更方法中设置脏标签
|
||
3. **实现脏标签检查逻辑**:在 `HeroViewComp` 的 `update` 中检查脏标签并按需更新UI
|
||
4. **清理脏标签**:UI更新完成后清理对应的脏标签
|
||
|
||
## 三、需要修改的具体文件及对应模块
|
||
|
||
### 3.1 HeroAttrsComp.ts
|
||
**修改模块**:
|
||
- 类属性:添加脏标签字段 `dirty_hp`、`dirty_mp`、`dirty_shield`
|
||
- `add_hp()` 方法:设置 `dirty_hp = true`
|
||
- `add_mp()` 方法:设置 `dirty_mp = true`
|
||
- `add_shield()` 方法:设置 `dirty_shield = true`
|
||
- `reset()` 方法:重置所有脏标签
|
||
|
||
**修改内容**:
|
||
- 添加脏标签字段:`dirty_hp: boolean = false`、`dirty_mp: boolean = false`、`dirty_shield: boolean = false`
|
||
- 在属性变更方法中设置对应的脏标签为 `true`
|
||
- 在 `reset` 方法中重置所有脏标签为 `false`
|
||
|
||
### 3.2 HeroViewComp.ts
|
||
**修改模块**:
|
||
- `update(dt: number)` 方法:添加脏标签检查逻辑,按需调用UI更新方法
|
||
|
||
**修改内容**:
|
||
- 在 `update` 中检查 `this.model.dirty_hp`、`this.model.dirty_mp`、`this.model.dirty_shield`
|
||
- 只在脏标签为 `true` 时调用对应的 `hp_show()`、`mp_show()`、`show_shield()`
|
||
- UI更新完成后清理脏标签为 `false`
|
||
|
||
### 3.3 HeroAttrEventSystem.ts
|
||
**修改模块**:
|
||
- 无需修改
|
||
|
||
**修改内容**:
|
||
- 脏标签方案不需要事件系统,保持现有实现即可
|
||
|
||
### 3.4 HeroAttrEvent.ts
|
||
**修改模块**:
|
||
- 无需修改
|
||
|
||
**修改内容**:
|
||
- 脏标签方案不需要事件组件,保持现有实现即可
|
||
|
||
## 四、预期效果
|
||
|
||
- **性能提升**:消除每帧不必要的UI更新,只在属性变化时更新,减少CPU开销
|
||
- **架构优化**:实现按需更新模式,解耦数据层和视图层
|
||
- **可维护性提升**:脏标签逻辑简单清晰,易于理解和维护
|
||
- **代码简洁**:无需引入复杂的事件系统,实现成本低
|