目录
Godot 会支持【此处插入 FMOD、GameWorks 等闭源 SDK 的名字】吗?
为什么 Godot 不强制用户实现 DOD(面向数据设计)?
程序员的洁癖 - 希望使用一套自己可以完全掌控的工具创造产品!
开篇废话
政安晨作为一名资深老猿,我由衷地推荐Godot,未来我将带着小伙伴们一起,开始Godot数字游戏开发的历程!
有小伙伴们会说了,这都AI时代了,游戏开发还有前途吗?
政安晨:这不是前不前途的问题,也不是钱不钱途的问题,人类的文明是从游戏中一路过来的,这里面有着人类文明最根本的智慧。如果世界全部演变成硅基形态,也许会形成它们自己的游戏之道。但是,作为碳基生命的我们,生活在以碳基生态为主要形式的地球上,小伙伴们不要否认我们作为碳基高等智慧生命在地球存在上的意义。游戏方式或许会成为AI时代的文明表达,这种趋势已经开始显现。这个或许才是我们要坚持下去的原因,也是找到志同道合者的基础。
这些年,我本人一直在关注Godot的发展,也一直在思考Godot这款游戏引擎在产品应用上的价值,它也许并不是最强大的,但却可能会是最健康的。感兴趣的程序员和爱好者们,可以关注它,以及它所体现出的思想火花,未来,我也会为大家解析和演绎如何应用它们。
这篇仅是一个笼统的介绍,目的仅仅是帮助小伙伴们快速预览,没有别的目的,了解Godot的小伙伴可以不用往下看了。
GDScript 是什么
GDScript 是 Godot 所集成的一门是从零开始构建的脚本语言,其目的就是用最少的代码将 Godot 的潜力最大化地发挥出来,让新手和专业开发人员都能尽可能快地利用 Godot 的优势进行开发。如果你曾经用类似 Python 这样的语言写过任何东西,那么你就会对 GDScript 感到得心应手。
使用 GDScript 有不少原因,特别是你在进行原型设计时、在项目的 alpha/beta 阶段、或者项目不是 3A 大作时会用到它,但 GDScript 最突出的优势就是整体复杂度得到降低。
为 Godot 创建一个紧密集成的自定义脚本语言的初衷有两点:
首先,它减少了启动和运行Godot 所需的时间,使开发人员沉浸于引擎并专注生产力;
其次,它减少了维护的总体负担,降低了问题的维度,让引擎开发者专注于排除错误并改进与引擎核心相关的功能,而不是花费大量时间试图在一大堆语言中获得一小部分增量功能。
由于 Godot 是开源项目,因此 GDScript 的开发从一开始就必须优先考虑更加集成、无缝的体验,而不是通过支持大多人熟悉的编程语言来吸引更多用户——特别是在支持那些大多人熟悉的语言会导致更糟糕的开发体验时。
我们理解你更想在 Godot 中使用其他语言。话虽如此,如果你还没试过 GDScript,那就先试它个三天。就像 Godot 一样,一旦你看到它的强大之处与开发之迅速,我们相信,你定将会对 GDScript 刮目相看。
创建 GDScript 背后的动机是什么
在早期,引擎使用 Lua 脚本语言。Lua 高性能来源于 LuaJIT,但是创建与面向对象系统的绑定(通过使用回退)是非常复杂且缓慢的,并且需要大量代码。在用 Python 进行了一些实验后,它也被证明是难以嵌入的。
为 Godot 创建自定义脚本语言的主要原因有:
Godot 使用多线程,而大多数脚本虚拟机对线程的支持不佳(Lua、Python、Squirrel、JavaScript、ActionScript 等)。
大多数脚本语言(Lua、Python、JavaScript)的虚拟机没有很好地支持类扩展,适配 Godot 工作方式的效率极低。
许多现有语言的 C++ 绑定接口都非常糟糕,会产生大量代码、错误、瓶颈,而且效率普遍低下(例如 Lua、Python、Squirrel、JavaScript 等)。我们希望专注于一个更好的引擎,而不是大量的缝合。
没有原生的向量类型(Vector3、Transform3D 等),导致使用自定义类型实现时,性能大大降低(Lua、Python、Squirrel、JavaScript、ActionScript 等)。
在大部分解释型编程语言(Lua、Python、JavaScript、ActionScript 等)中,垃圾收集器会导致延迟或不必要的大内存使用。
难以与代码编辑器集成从而提供代码补全、实时编辑等功能(其他语言都这样)。
GDScript 正是为了减少上述问题,同时防止其他更多问题而设计的。
Godot 会支持【此处插入 FMOD、GameWorks 等闭源 SDK 的名字】吗?
Godot 的目标是创建一个自由开源、MIT 许可、模块化和可扩展的引擎。核心引擎开发社区没有计划支持任何第三方、闭源或专有 SDK,因为集成这些 SDK 会违背 Godot 的精神。
正因为 Godot 是开源和模块化的,所以没有什么能阻止你或其他任何感兴趣的人将这些库添加为模块,并以开源或闭源的方式在你的游戏中使用他们。
如欲了解如何支持你使用的 SDK,请查看下面的插件问题。
如果你知道 Godot 尚不支持但提供自由和开源集成的第三方SDK,请考虑自己开始集成工作。Godot 不属于个人;它属于社区,它与像你一样雄心勃勃的社区贡献者一起成长。
是否能用 Godot 创建非游戏应用?
是的!Godot 具有广泛的内置 UI 系统,其较小的软件包可以使它成为 Electron 或 Qt 等框架的合适替代品。
当创建一个非游戏的应用程序时,确保在项目设置中启用 低处理器模式 以减少CPU和GPU占用。
Godot 使用的用户界面工具包是什么?
Godot 不使用标准的 GUI 工具箱,如 GTK、Qt 或 wxWidgets。相反,Godot 使用自己的用户界面工具包,使用 OpenGL ES 或 Vulkan 进行渲染。这个工具包以控件节点(Control)的形式暴露出来,用于渲染编辑器(用 C++ 编写)。这些控制节点也可以在 Godot 支持的任何脚本语言的项目中使用。
这个定制的工具包使它能获益于硬件加速,并在全平台上拥有一致的外观。最重要的是,它不必处理 GTK 或 Qt 所带来的 LGPL 许可注意事项。最后,这意味着 Godot 在“自产自用”,因为编辑器本身就是 Godot UI 系统中最复杂的用例之一。
为什么 Godot 使用 SCons 构建系统?
Godot 使用 SCons 构建系统。近期没有改用其他构建系统的计划。我们选择 SCons 而不是其他构建系统的原因有很多,例如:
Godot 可以针对多种不同的平台进行编译:所有 PC 平台、所有移动平台、各种游戏主机、WebAssembly。
开发者们经常需要同时将代码编译到多个平台上,或者同一个平台的不同架构上,但他们负担不起每次都要重新配置和重构项目。SCons 可以毫不费力地完成此任务,而不会破坏构建。
无论对项目做出多少修改、配置、增加、删除之类的事情,SCons 都不会 把构建工作搞砸。
Godot的构建过程并不简单。几个文件由代码生成(绑定器),其他文件被解析(着色器),而其他文件则需要提供自定义( 模块)。这需要复杂的逻辑,而该逻辑更容易用实际的编程语言(如Python)编写,而不是使用基于宏且仅限于构建过程的语言。
Godot 的构建过程大量使用了交叉编译工具。每个平台都有特定的检测过程,需要为各个平台编写特殊代码,将这些作为特殊情况处理。
如果你想要自己构建 Godot,放宽心态, 至少稍微熟悉一下这个构建系统。
为什么 Godot 不使用异常?
我们相信无论如何游戏都不应该崩溃。如果发生意外情况,Godot将打印一个错误(甚至可以追溯到脚本),但之后它会尽可能优雅地恢复,并继续前进。
此外,异常会显著增加可执行文件的二进制大小,并且导致编译时间增加。
Godot使用 ECS(实体组件系统)吗?
Godot不使用 ECS 而是依赖于继承。虽然没有一种普遍的更好的方法,我们发现使用继承的效率已经可以满足于绝大多数使用场景。
也就是说,没有什么能阻止你在项目中通过使用脚本创建子节点来使用组合。这些节点可以在随后的运行时中添加和删除,以实现动态添加和删除。
为什么 Godot 不强制用户实现 DOD(面向数据设计)?
尽管 Godot 的内部实现中尽可能的使用了缓存一致性,但我们认为不应该强迫用户使用 DOD。
DOD 主要是缓存一致性优化,只有在每帧需要处理数以万计的对象,并且做出的修改较少时,才能够提供显著的性能提升。假如你每帧要移动的精灵或敌人只有几百个,那么 DOD 并不会带来有意义的性能提升。在这种情况下,你应该考虑别的优化手段。
绝大多数游戏都不需要这个, 并且Godot提供了方便的辅助工具来完成大多数情况下的工作.
如果一个游戏的确需要处理数量较多的游戏对象,那么建议使用 C++ 和 GDExtensions 处理那些需要高性能的部分,使用 GDScript(或 C#)来负责游戏的其它部分。
Godot的特性
编辑器
特性:
-
场景树编辑器。
-
内置脚本编辑器。
-
支持 Visual Studio Code、VIM 等外部文本编辑器。
-
GDScript 调试器。
-
从 4.2 版本开始支持多线程调试。
-
-
可视化(性能)分析器能指出在渲染管线中 CPU 与 GPU 在每个步骤花费的时间。
-
性能监视工具,包括自定义性能监视器。
-
脚本热重载。
-
场景热编辑。
-
更改会在编辑器中生效并且会在关闭当前项目后保留。
-
-
远程检查器。
-
在关闭正在运行的项目后,更改不会被反映在编辑器中,也不会被保留。
-
-
实时摄像机复制。
-
移动编辑器中的摄像头,并在正在运行的项目中查看结果。
-
-
内置离线类参考文档。
-
使用由社区贡献的支持数十种语言的编辑器。
插件:
渲染
提供 3 种渲染方法(运行在 2 种渲染驱动上):
-
Forward+,在Vulkan 1.0 以上运行(具备可选的 Vulkan 1.1和 1.2 功能)。仅适用于桌面平台的最先进图形后端。在桌面平台上默认使用。
-
Forward Mobile,在 Vulkan 1.0 以上运行(带有可选的 Vulkan 1.1 和 1.2 功能)。该功能较少,但渲染简单场景更快。适用于移动和桌面平台。在移动平台上默认使用。
-
Compatibility(兼容),在 OpenGL 3.3、OpenGL ES 3.0 和 WebGL 2.0 以上运行。最低级的图形后端,适合低端桌面和移动平台。在 Web 平台上默认使用。
2D 图形
-
精灵、多边形和线条渲染。
-
AnimatedSprite2D 辅助制作动画精灵。
-
视差层。
-
伪 3D 支持,可在编辑器中进行预览。
-
-
带有法线贴图和镜面反射贴图的 2D 光照。
-
2D 点光源(全向灯/聚光灯)和平行光源。
-
硬阴影或软阴影(可根据每个光源进行调整)。
-
自定义着色器可以访问一个基于 LightOccluder2D 节点的,由实时 SDF 表示的二维场景,它可以用于改进二维照明效果,包括二维全局光源。
-
-
字体渲染使用位图,光栅化使用 FreeType 或多通道有符号距离场(MSDF)。
-
位图字体可以使用 BMFont 等工具导出,也可以从图像导入(仅适用于等宽字体)。
-
动态字体支持单色字体以及彩色字体(例如用于表情符号)。支持的格式有 TTF、OTF、WOFF1 和 WOFF2。
-
动态字体支持具有可调整宽度和颜色的可选字体轮廓。
-
动态字体支持可变字体和 OpenType 功能,包括连字(ligatures)。
-
当字体文件缺少粗体和斜体样式时,动态字体支持模拟这些样式。
-
动态字体支持超采样, 以在更高的分辨率下保持字体的清晰度.
-
动态字体支持亚像素定位(subpixel positioning),使字体在小尺寸下更清晰。
-
动态字体支持 LCD 亚像素优化,使字体在小尺寸下更加清晰。
-
带符号距离场字体可以在任何分辨率下进行缩放,而无需重新光栅化。与单色带符号距离场字体相比,利用多通道可使带符号距离场字体更好地缩放至更小尺寸。
-
-
基于 CPU 的粒子。
-
为了更好的辉光功能,可选择 2D HDR 渲染 。
2D 工具
-
TileMap 用于由 2D 图块构建的关卡设计。
-
内置平滑和拖动边距的 2D 相机.
-
用于代表 2D 空间中的一条路径的 Path2D 节点。
-
可以在编辑器中绘制或者通过程序生成。
-
用于使节点跟随一条Path2D的PathFollow2D 节点.
-
2D 物理
物理体:
-
静态物体。
-
动画体(用于仅通过脚本或动画移动的物体,如门和平台)。
-
刚体。
-
角色体。
-
关节。
-
用以检测实体进入或离开的区域.
碰撞检测:
-
内置形状:线条,框体,圆圈,胶囊,世界边界(无限平面)。
-
碰撞多边形(可以人工绘制,或者在编辑器中根据精灵生成)。
等等不再赘述
文档快捷入口
以下内容不再赘述,为了文档的完整性,完成这篇文档介绍后,逐渐就会进入开发实战了。
嘻嘻。