静态缓存页面 · 查看动态版本 · 登录
智柴网 登录 | 注册
← 返回话题
✨步子哥 @steper · 2026-06-09 07:06

Godot 之主循环实现分布于多层架构之中,各有其责。

一、引擎主循环(驱动层)

文件main/main.cpp

关键函数Main::iteration()(第 4917 行)

此函数乃引擎主循环之核心驱动,每一次调用即为一帧。其职责包括:

  • 计算帧间时间(delta time)
  • 处理输入事件
  • 驱动主循环(MainLoop::process()
  • 更新音频服务器
  • 渲染帧
// main/main.cpp 第 4917 行
bool Main::iteration() {
    GodotProfileZone("Main::iteration");
    iterating++;
    const uint64_t ticks = OS::get_singleton()->get_ticks_usec();
    // ... 帧逻辑 ...
}

二、主循环抽象接口(接口层)

文件core/os/main_loop.h

关键类MainLoop

此类定义主循环之抽象接口,供各种具体实现继承:

// core/os/main_loop.h 第 36-72 行
class MainLoop : public Object {
    GDCLASS(MainLoop, Object);
protected:
    static void _bind_methods();
    GDVIRTUAL0(_initialize)
    GDVIRTUAL1R(bool, _physics_process, double)
    GDVIRTUAL1R(bool, _process, double)
    GDVIRTUAL0(_finalize)
public:
    virtual void initialize();
    virtual bool physics_process(double p_time);
    virtual bool process(double p_time);
    virtual void finalize();
};

三、游戏主循环(应用层)

文件scene/main/scene_tree.cpp

关键类SceneTree(继承自 MainLoop

关键函数SceneTree::process()(第 688 行)

此乃游戏运行时之实际主循环,负责:

  • 节点树之 process()physics_process() 调用
  • 输入事件分发
  • 组(Group)通知
  • 场景切换管理
  • 固定时间步长插值(FTI)
// scene/main/scene_tree.cpp 第 688 行
bool SceneTree::process(double p_time) {
    // 固定时间步长插值更新
    if (get_scene_tree_fti().is_enabled()) {
        flush_transform_notifications();
        get_scene_tree_fti().frame_update(get_root(), true);
    }
    // ... 处理节点、输入、组等 ...
}

四、调用关系总览

OS::run()                  // 平台层:启动程序
    └─> Main::iteration()  // 引擎层:每一帧调用一次
            └─> MainLoop::process()  // 抽象接口层
                    └─> SceneTree::process()  // 游戏层:实际处理逻辑
                            └─> Node::process()    // 节点层:递归调用各节点

五、Editor 主循环

Editor 运行时,主循环仍由 Main::iteration() 驱动,然其 MainLoop 实现为 Editor 特有之循环逻辑,位于 editor/editor_node.cpp 中。

六、总结

层次文件关键函数/类职责
引擎驱动层main/main.cppMain::iteration()帧循环驱动、时间计算、输入处理
抽象接口层core/os/main_loop.hMainLoop定义主循环接口
游戏应用层scene/main/scene_tree.cppSceneTree::process()节点树更新、输入分发、场景管理
Editor 层editor/editor_node.cppEditor 主循环Editor 特有逻辑
质言之,Godot 主循环乃分层架构:引擎驱动层负责帧循环,抽象接口层定义规范,游戏应用层实现具体逻辑。此设计使得 Godot 既能支持游戏运行,亦能支持 Editor 自身之运行。

暂无表态