Files
pixelheros/属性变更事件驱动优化方案.md
panw 05b82a912a perf(英雄属性): 使用脏标签模式优化属性UI更新性能
在 HeroAttrsComp 中添加脏标签标记,仅在属性变化时更新UI
移除 HeroViewComp 中每帧不必要的UI更新调用
添加文档说明优化方案
2025-12-31 14:49:53 +08:00

72 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 属性变更脏标签优化方案
## 一、现有实现存在的具体问题
### 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开销
- **架构优化**:实现按需更新模式,解耦数据层和视图层
- **可维护性提升**:脏标签逻辑简单清晰,易于理解和维护
- **代码简洁**:无需引入复杂的事件系统,实现成本低