perf(英雄属性): 使用脏标签模式优化属性UI更新性能

在 HeroAttrsComp 中添加脏标签标记,仅在属性变化时更新UI
移除 HeroViewComp 中每帧不必要的UI更新调用
添加文档说明优化方案
This commit is contained in:
panw
2025-12-31 14:49:53 +08:00
parent bb0ed6a9c3
commit 05b82a912a
4 changed files with 110 additions and 29 deletions

View File

@@ -0,0 +1,71 @@
# 属性变更脏标签优化方案
## 一、现有实现存在的具体问题
### 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开销
- **架构优化**:实现按需更新模式,解耦数据层和视图层
- **可维护性提升**:脏标签逻辑简单清晰,易于理解和维护
- **代码简洁**:无需引入复杂的事件系统,实现成本低