2.8 KiB
2.8 KiB
属性变更脏标签优化方案
一、现有实现存在的具体问题
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 实现步骤
- 添加脏标签标记:在
HeroAttrsComp中添加血量、魔法值、护盾的脏标签 - 修改属性变更方法:在
HeroAttrsComp的属性变更方法中设置脏标签 - 实现脏标签检查逻辑:在
HeroViewComp的update中检查脏标签并按需更新UI - 清理脏标签:UI更新完成后清理对应的脏标签
三、需要修改的具体文件及对应模块
3.1 HeroAttrsComp.ts
修改模块:
- 类属性:添加脏标签字段
dirty_hp、dirty_mp、dirty_shield add_hp()方法:设置dirty_hp = trueadd_mp()方法:设置dirty_mp = trueadd_shield()方法:设置dirty_shield = truereset()方法:重置所有脏标签
修改内容:
- 添加脏标签字段:
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开销
- 架构优化:实现按需更新模式,解耦数据层和视图层
- 可维护性提升:脏标签逻辑简单清晰,易于理解和维护
- 代码简洁:无需引入复杂的事件系统,实现成本低