Godot引擎本身是如何构造的?

cak*_*ver 2 c++ gdscript godot

我正在考虑对引擎的源代码进行一些更改,因此我查看了github
上的源代码上的源代码,但我完全不知道它实际上是如何组成的。

在网上我找不到任何关于引擎本身如何的信息如何制造的信息,只能找到它能做什么。

我想到了几个问题:

  1. 主脚本从哪里开始?是来自Main::setup()吗?

  2. 发动机工作的流程图是什么?

  3. 引擎UI是如何构建的?(从 Web 开发的角​​度来看,它的等效 HTML 是什么?)

我不是 C++ 方面的高级专家,因此即使是一般性的抽象概述也会对入门非常有帮助

The*_*aot 5

Godot 构建是使用SCons从 python 编排的,您可以在文档构建系统简介中阅读。每个平台都不同(例如,您需要适用于 Android 的 JDK)。

\n

如您所知,您可以在 github 上找到 Godot 源代码。在进一步讨论之前,我需要指出,在编写本文时,存储库的主分支对应于 Godot 4 的开发版本。您可能希望根据您想要使用的版本更改为不同的分支。

\n

免责声明:我更熟悉 Godot 3 代码库。

\n

现在,不仅每个平台的构建过程不同,API 绑定和入口点也不同。您想要查看平台文件夹内的操作系统特定代码。

\n

例如,Windows 的入口点可以在godot_windows.cpp中找到,如下所示:

\n
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {\n    godot_hinstance = hInstance;\n    return main(0, nullptr);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

你可以从那里顺着逻辑走,你会发现最终他们做了一些初始化并调用类的方法和setup方法。您可以在适当命名的主文件夹中找到该类。之后,平台特定的代码将进入其主循环,完成后它将调用该类的方法,然后释放任何平台特定的东西。startMainMaincleanupMain

\n

顺便说一句,当我说类位于文件夹中时,我的意思是同时存在 .cpp 和 .h 文件。

\n

主循环可能会做其他事情,但它必须调用类iteration的方法Main。您可以看到代码计算时间、调用不同的“服务器”、调度输入等。

\n
\n

我们没有流程图。遗憾的是,我们必须将总体流程拼凑在一起。例如,我写过有关在其他地方实例化场景时会发生什么的文章。我也研究了queue_free你可以在其他地方找到的内容。

\n

我将在下面进一步讨论主循环。但首先我想向您指出我们现有的图表:

\n\n
\n

现在,主循环中更熟悉的部分是必须有该类的实例MainLoop。它定义了初始化和终止方法,以及主循环每次迭代时调用的方法。默认情况下,它将是该类的一个实例SceneTree(扩展该类MainLoop),但您可以在项目设置中更改它。您可以MainLoopcore/os 文件夹scene/main 文件夹SceneTree中找到该类。

\n

该类SceneTree具有传播对\xe2\x80\xa6 场景树的调用_process以及_physics_process在\xe2\x80\xa6 场景树上传播调用的方法。具有SceneTree一个root类型的对象Viewport(在 Godot 4 中它是 a Window,它是 的类型Viewport)。而且,如您所知,Viewport是 的一种类型Node,并且可以生孩子。的子项root是自动加载、当前场景以及您放在那里的任何其他内容\xe2\x80\xa6 因此,从那里开始,Node我希望您更加熟悉 s 。

\n

另一方面,您有 sigletons(实际的signletons,而不是自动加载),包括“服务器”和其他一些静态实用程序类。如果您还记得 Godot 有不同的渲染后端,它们都位于“服务器”的 fa\xc3\xa7ade 后面(VisualServerGodot 3 中的,RenderingServerGodot 4 中的)。在 Godot 3 中,我们可以选择 GLES2 和 GLES3 来渲染后端。后端还需要绑定,您可以在平台文件夹中再次找到这些绑定。

\n

这就是我对 Godot 源代码的熟悉程度耗尽的地方:我不知道着色器管道是如何工作的。

\n

用户界面?就像其他所有东西一样,它是使用正在使用的任何渲染后端来渲染的。在网上?它将位于CanvasHTML 元素上(在 WebGL 上下文上)。HTML?Web 构建模板的 HTML 代码也是可配置的(构建导出设置上的自定义 HTML shell 选项)请参阅用于 Web 导出的自定义 HTML 页面。Web 的构建过程?它使用 Emscripten(到 WebAssembly)。不,需要明确的是,Godot 中没有 Node.js 的东西。

\n
\n

根据更改,您可能可以学习相关课程。例如,如果您想要处理,AnimationPlayer您可以在场景/动画文件夹中找到它并在那里进行更改,而不必担心引擎的其余部分如何工作。

\n

要构建引擎,正如我一开始所说的,您需要 SCons。请参阅编译并按照文档中适合您的平台的步骤进行操作。

\n

关于将您的更改合并到 Godot 中,您需要从一个问题或提案(由您或其他人编写)开始。接下来是拉取请求。请参阅贡献以了解将您的更改合并到 Godot 的整个流程和指南。

\n

最后,如果您在修改引擎时遇到困难,您可以尝试Godot Contributors Chat

\n