跳转至

运行时任务调度

GFRuntimeTaskScheduler 用来表达运行中的互斥任务:任务声明自己占用哪些对象 requirement,调度器负责冲突判断、可中断替换、按帧推进、默认任务恢复和诊断快照。

这个能力适合角色默认行为、临时工具模式、交互流程、编辑器状态或项目自定义运行时编排。框架不绑定输入事件、动画节点、角色控制器或具体 UI;项目层只把这些业务含义映射为任务。

核心类型

  • GFRuntimeTask:任务协议,声明 requirementsinterruptibleinitialize()tick()physics_tick()is_finished()end()
  • GFCallableRuntimeTask:用 Callable 快速声明轻量任务。
  • GFRuntimeTaskGroup:把多个任务组合为顺序、等待全部或竞速完成。
  • GFRuntimeTaskScheduler:负责调度、冲突仲裁、默认任务恢复和活动任务查询。

Requirement 仲裁

同一个 requirement 同一时间只会归一个任务所有。新任务请求已占用的 requirement 时:

  • 占用任务不可中断:新任务被拒绝,调度器发出 task_rejected
  • 占用任务可中断:旧任务收到 end(true),新任务进入调度器。

Requirement 可以是项目认为需要互斥占用的任意 Object,例如角色节点、工具上下文、运行时控制域或一个专门的 RefCounted token。不要把 requirement 用作业务状态枚举;它只表示“这段资源当前只能有一个任务控制”。

默认任务

register_default_task(requirement, task) 可为 requirement 注册默认任务。调度器发现 requirement 空闲时会自动调度默认任务;前台任务可以中断可中断默认任务,结束后默认任务会在后续推进中恢复。

使用示例

var actor_token: RefCounted = RefCounted.new()
var scheduler: GFRuntimeTaskScheduler = GFRuntimeTaskScheduler.new()

var idle_task: GFCallableRuntimeTask = GFCallableRuntimeTask.new(
    func(_task: GFCallableRuntimeTask, _scheduler: GFRuntimeTaskScheduler) -> void:
        pass,
    func(delta: float, _task: GFCallableRuntimeTask, _scheduler: GFRuntimeTaskScheduler) -> void:
        pass
)
idle_task.finish_after_initialize = false
scheduler.register_default_task(actor_token, idle_task)

var interact_task: GFCallableRuntimeTask = GFCallableRuntimeTask.new(
    func(_task: GFCallableRuntimeTask, _scheduler: GFRuntimeTaskScheduler) -> void:
        pass
)
interact_task.add_requirement(actor_token)
scheduler.schedule(interact_task)

使用边界

  • 需要撤销、重做和历史栈时,优先使用 GFCommandHistoryUtilityGFUndoableCommand
  • 需要一次性顺序流程、Signal 等待和失败报告时,优先使用 GFCommandSequence
  • 需要动画、Tween 或视觉动作编排时,优先使用 ActionQueue 相关类型。
  • 运行时任务调度器关注“谁现在占用什么并如何被推进”;业务解释、日志等级、用户提示和具体恢复策略留给项目层。