Skip to content

UpdateModule 树状更新系统

UpdateModule 统一管理需要帧更新的普通 C# 对象。它用树状节点组织更新作用域,可以一次暂停、恢复、缩放或释放整棵子树,并支持 UpdateLateUpdate 两个执行阶段和自定义更新间隔。

子功能

基础使用

需要更新的对象实现 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 状态。
  • SetEnableSetInterval 和 phase 不动态传播;无参创建只复制创建时的值。
  • inheritParentState = false 只隔离暂停和 TimeScale,不阻止父子树释放。
  • 注册后的对象不会在注册调用栈或当前阶段快照中立即更新。
  • 同一 Phase 不保证稳定执行顺序。
  • UpdateModule 不捕获 IUpdate.OnUpdate 的业务异常,异常会直接暴露。
  • Handle 在模块清理后失效;业务仍应在自己的生命周期退出时主动释放,而不是等待框架兜底。

SuperCore 使用 MIT License 开源