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