blender 分析

拖动有关的代码

文件/类 功能
editor/plugins/node_3d_editor_plugin.cpp 3D 编辑器主逻辑,管理 Gizmo
editor/plugins/node_3d_editor_gizmos.cpp Gizmo 渲染和交互逻辑
scene/3d/node_3d.cpp 3D节点的变换操作
core/math/transform_3d.h 变换矩阵计算
新建场景的时候左边的几个节点
editor/scene_tree_dock.cpp
菜单编辑:行 7950
editor/editor_node.cpp
右上角运行工具栏:行 578
editor/gui/editor_run_bar.cpp
3d编辑器的代码 行: 9120
editor\plugins\node_3d_editor_plugin.cpp
启动运行状态:行 269
editor/debugger/editor_debugger_node.cpp
游戏调试工具栏:行 1079
editor\plugins\game_view_plugin.cpp
计划1:
调试状态,看看是否可以单独提取出来用
计划2:
能否使用js脚本,或者litegraph脚本

Godot 中 .gd 文件的编译流程与 ScriptInstance 对象的创建

在 Godot 引擎中,GDScript (.gd) 文件从源代码到可执行的 ScriptInstance 对象的转换过程涉及多个步骤。以下是详细的流程说明:

1. 编译流程概述

  1. 词法分析 (Lexing):将源代码分解为标记 (tokens)
  2. 语法分析 (Parsing):根据语法规则构建抽象语法树 (AST)
  3. 字节码生成:将 AST 转换为虚拟机字节码
  4. 运行时实例化:创建 ScriptInstance 对象

2. 详细步骤

2.1 词法分析和语法分析

当 Godot 加载一个 .gd 文件时:

  • 首先通过 GDScriptParser 类进行解析
  • 生成抽象语法树 (AST) 表示脚本结构

2.2 字节码编译

解析完成后:

  • GDScriptCompiler 类将 AST 转换为字节码
  • 字节码是为 Godot 的虚拟机 (GDScript VM) 设计的中间表示
  • 编译过程包括:
    • 变量和函数注册
    • 类型检查
    • 优化

2.3 创建 Script 资源

编译完成后:

  • 生成 GDScript 资源对象(继承自 Script 类)
  • 这个对象包含:
    • 字节码
    • 符号表(变量、函数、信号等)
    • 继承关系信息
    • 其他元数据

2.4 实例化为 ScriptInstance

当脚本附加到节点或需要实例化时:

  1. 创建脚本实例

    Ref<Script> script = ResourceLoader::load("res://example.gd");
    Object *obj = ClassDB::instance("Node"); // 或其他类
    obj->set_script(script);
    
  2. 内部实例化过程

    • 引擎调用 Script::instance_create() 方法
    • GDScript 类重写此方法,创建 GDScriptInstance 对象
    • GDScriptInstance 继承自 ScriptInstance
  3. 实例初始化

    • 为实例变量分配内存
    • 设置基类(如果脚本继承自另一个脚本)
    • 调用 _init() 方法(如果存在)

3. 关键数据结构

  • GDScript:表示编译后的脚本资源
  • GDScriptInstance:脚本的运行时实例
    • 管理实例变量
    • 处理方法调用
    • 维护与宿主 Object 的关系

4. 执行模型

当调用脚本方法或访问属性时:

  1. GDScriptInstance 接收调用
  2. 查找方法或属性
  3. 如果是字节码方法,由 GDScript VM 执行
  4. 如果是原生方法,直接调用绑定方法

5. 性能考虑

  • 首次加载脚本时有编译开销
  • 后续实例化速度较快(因为字节码已生成)
  • 方法调用比原生 C++ 方法稍慢(由于虚拟机开销)

1. Godot 脚本的运行原理

Godot 的脚本系统通过 ScriptServer 管理多种脚本语言(如 GDScript、C#、Python 等),并在游戏运行时动态调用脚本逻辑。核心流程如下:

  1. 脚本加载与实例化

    • 当场景加载时,Godot 会解析附加到节点的脚本(如 .gd 文件),并将其编译为 ScriptInstance 对象。
    • 脚本的 _init()_ready() 方法会在节点初始化时自动调用。
  2. 主循环与脚本执行

    • Godot 的主循环(Main::iteration)每秒执行多次,负责更新游戏状态、物理模拟和脚本逻辑。
    • 脚本中的 _process(delta)_physics_process(delta) 方法会被引擎在每一帧或物理步长时调用。
  3. 脚本与节点绑定

    • GDScript 可以直接通过 $NodePath 语法访问场景树中的节点,而 Python 需要通过 GDNative 接口间接操作。
block_code 绘制背景: 行 254
addons\block_code\ui\blocks\utilities\background\background.gd
AI绘图