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

2.8 KiB
Raw Permalink Blame History

属性变更脏标签优化方案

一、现有实现存在的具体问题

1.1 性能问题

  • HeroViewComp.tsupdate(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. 实现脏标签检查逻辑:在 HeroViewCompupdate 中检查脏标签并按需更新UI
  4. 清理脏标签UI更新完成后清理对应的脏标签

三、需要修改的具体文件及对应模块

3.1 HeroAttrsComp.ts

修改模块

  • 类属性:添加脏标签字段 dirty_hpdirty_mpdirty_shield
  • add_hp() 方法:设置 dirty_hp = true
  • add_mp() 方法:设置 dirty_mp = true
  • add_shield() 方法:设置 dirty_shield = true
  • reset() 方法:重置所有脏标签

修改内容

  • 添加脏标签字段:dirty_hp: boolean = falsedirty_mp: boolean = falsedirty_shield: boolean = false
  • 在属性变更方法中设置对应的脏标签为 true
  • reset 方法中重置所有脏标签为 false

3.2 HeroViewComp.ts

修改模块

  • update(dt: number) 方法添加脏标签检查逻辑按需调用UI更新方法

修改内容

  • update 中检查 this.model.dirty_hpthis.model.dirty_mpthis.model.dirty_shield
  • 只在脏标签为 true 时调用对应的 hp_show()mp_show()show_shield()
  • UI更新完成后清理脏标签为 false

3.3 HeroAttrEventSystem.ts

修改模块

  • 无需修改

修改内容

  • 脏标签方案不需要事件系统,保持现有实现即可

3.4 HeroAttrEvent.ts

修改模块

  • 无需修改

修改内容

  • 脏标签方案不需要事件组件,保持现有实现即可

四、预期效果

  • 性能提升消除每帧不必要的UI更新只在属性变化时更新减少CPU开销
  • 架构优化:实现按需更新模式,解耦数据层和视图层
  • 可维护性提升:脏标签逻辑简单清晰,易于理解和维护
  • 代码简洁:无需引入复杂的事件系统,实现成本低