UpdateModule 树状更新系统
UpdateModule 统一管理需要帧更新的普通 C# 对象。它用树状节点组织更新作用域,可以一次暂停、恢复、缩放或释放整棵子树,并支持 Update、LateUpdate 两个执行阶段和自定义更新间隔。
子功能
基础使用
需要更新的对象实现 IUpdate:
csharp
using SuperCore.RunTime;
public sealed class MoveAgent : IUpdate
{
private UpdateHandle m_UpdateHandle;
public void Enable()
{
UpdateModule module = UpdateModule.Get();
if (module == null)
return;
m_UpdateHandle = module.Register(this);
}
public void Disable()
{
m_UpdateHandle.Release();
m_UpdateHandle = default;
}
public void OnUpdate(float dt)
{
// dt 已包含当前 Update 节点的有效 TimeScale。
}
}快捷入口:
csharp
UpdateHandle handle = UtilFunc.Update(this);注册和释放必须成对。实体 Agent、Part、UI 或 GameSystem 应在自己的启用/退出生命周期中管理句柄。
设计思路与生命周期
模块使用三部分数据:
- 带父子/兄弟 id 的
UpdateNode数组,表达树结构和继承状态。 - Update、LateUpdate 两个只包含真正行为节点的紧凑活动数组;纯结构节点不会进入每帧扫描。
- id/version 句柄控制器,防止槽位复用后旧 Handle 命中新节点。
注册节点时先建立树关系,再放入对应 Phase 的待激活队列。它不会进入当前阶段已经开始的快照。释放时先立即递归标记 inactive,确保本帧后续阶段不再执行,然后在 Update/LateUpdate 扫描结束后回收整棵子树。
OnInit 创建不可释放的 Root 并完成初始化;OnClear 清理全部节点、活动数组、待处理队列和句柄版本。
注意事项与限制
- 注册和释放必须成对;优先释放一个业务作用域根节点,而不是遗漏多个叶子句柄。
- 结构节点没有 IUpdate,不会产生每帧回调开销,但仍占用一个句柄槽位。
- 父节点 Pause/Resume 不会覆盖子节点自己的 Pause 状态。
SetEnable、SetInterval和 phase 不动态传播;无参创建只复制创建时的值。inheritParentState = false只隔离暂停和 TimeScale,不阻止父子树释放。- 注册后的对象不会在注册调用栈或当前阶段快照中立即更新。
- 同一 Phase 不保证稳定执行顺序。
- UpdateModule 不捕获
IUpdate.OnUpdate的业务异常,异常会直接暴露。 - Handle 在模块清理后失效;业务仍应在自己的生命周期退出时主动释放,而不是等待框架兜底。
