我曾经在 Skypjack 的博客上读到这样一句话:“一切都有成本,程序员是决定支付哪种成本的人。”当时我正在研究如何在 C# 中实现一个好的 UI 框架,这显然仍然是一个问题,但让我们在另一个时候讨论它。然而,这句话却在我脑海中不断浮现。

讽刺的是,这个旅程本身发生在我读到那句话的许多年之前。我的童年是在没有 YouTube 视频教程、没有专门的游戏开发课程和没有商业引擎的时代。要了解游戏中的某个部分是如何工作的,你必须购买一本书或自己构建它。正是这样,我做到了。

我从来没有预料到会完成我的引擎。它是我的个人乐园——一个地方可以观察到运动的部件、学习、实验和偶尔犯下疯狂的错误。回头看,游戏开发一直是我动力的来源,而好奇心一直是我的动力。每当我遇到限制时,我通常会问为什么某样东西是这样做的。

构建构建者

当引擎变得越来越大时,维护它变得比编写它更困难。我必须在不同的机器和 IDE 之间移动,这意味着维护巨大的 Visual Studio 解决方案或同样巨大的 Makefiles。对我来说,两者描述的都是相同的项目,只不过是以不同的形式。那个时候,我发现了几个强烈影响我的思维的想法:一个小的 GitHub 项目、一篇关于 Convention over Configuration 的文章,以及 Unreal Engine 的 Build Tool,UBT。

经过三次重大修订后,这些实验演变成了我的自己的 SDK。尽管游戏和引擎不断增长,尽管被称为模块化的引擎仍然依赖于一个不断膨胀的核心,我开始思考引擎是否可以从许多小的、专门化的模块中组装起来,并以最小的引导程序形式分发,只下载项目实际需要的内容。所有这些都变成了 Hecate,我的个人构建工具。

当一个解决方案创造了下一个问题

构建系统解决了一个问题,但立即揭示了另一个问题。常规表达式不再足以理解现代 C++ 项目,所以我最终实现了一个完整的 C++ 预处理器。这,反过来,又使静态分析和 linting 成为几乎是一个副产品。与此同时,我感到需要图形工具的感觉如同下一个大事要去做。

C# 是决定一个好的解决方案的困难之处。WinForms 没有足够的灵活性来实现我所需的东西,WPF 将我绑定在 Windows 上,web 框架感觉不必要地重量级。同时,我在寻找替代方案的过程中发现了反应式编程。与此同时,我也遇到了 Skypjack 的 ECS 博客。尽管它们来自不同的领域,但两者共享相同的基本思想:让数据驱动行为,而不是将行为紧密耦合到对象上。这种思想成为了 缺失的拼图片

从数据到执行

一旦所有东西变得越来越数据驱动,另一个问题出现了。为什么工具要存在于命令行应用程序和图形应用程序之间?最大的转变出现在我对 Linux 和 Linux 内核产生了浓厚兴趣之后。它的体系结构深深地吸引了我。内核模块不以任意方式与彼此交互。它们依赖于内核暴露的能力,同时保持着彼此之间的独立性。

有一天我意识到,同样的原则也应该适用于游戏引擎。游戏引擎最终是游戏执行的操作系统。一旦我开始从这个角度看待引擎,许多长期的假设不再有意义:

  • 为什么游戏行为被永久编译到引擎中?
  • 为什么模组与第一方功能的本质是不同的?
  • 为什么系统仍然以 OOP 为中心,而不是通过数据流和实体来协作?

这些问题成为 新 SDK 和能力驱动的架构模型的基础。

重思开发的成本

最后一个影响来自一篇关于 Deck13 的 Fledge 引擎的旧文章。他们的哲学很简单:程序员提供可重用的动作,而设计师从这些构建块中组装游戏玩法。我一直在思考这个想法有多远:

  • 如果这些构建块变成反应式数据流?
  • 如果 ECS 变成执行模型?
  • 如果一切都可以可视化地建模,并转换为不同的编程语言和平台?

这些问题最终变成了第三个部分,和 新引擎架构数据驱动的编辑器 一起生活;游戏开发环境的主要开发环境。

与此同时,仍然存在一个需要一个强大的 UI 框架的需求,我开始对 web 浏览器看待 differently —— 不是作为一个 web 应用程序的平台,而只是作为开发工具的渲染引擎。浏览器渲染界面,而一个本机应用程序通过一个轻量级的 HTTP 服务器暴露其功能,保持了轻量级的性质,而不使用重量级的 web 框架,同时利用了每个操作系统都有的标准浏览器: 基于浏览器的 UI 运行时

下一步发生了什么

SDK 感觉更像是一个目的地,而不是一个目的地。它更像是一个从自行车到高速列车的转变。

我也发现,很多潜在的想法不再像以前那么不常见了。Epic 正在向 Verse 进行转变,并将 Unreal Engine 6 描述为一个更动态的运行时,整个行业似乎正在探索与过去 7 年我脑海中思考的问题相同的问题——尽管当然不是相同的解决方案。

如果这个旅程激发了有趣的讨论或激发了你思考不同的方法,那么这已经超过了我最初的期望。然而,请告诉我你想说什么!