https://p.ipic.vip/17kj9a.png

一、什么是全链上游戏的“引擎”?

1.1 游戏引擎

就如同汽车的发动机引擎是一辆车的动力来源,其控制着一切相关的模块如喷油、点火、进气等等,并且连通着油箱、驱动轴等组件,车厂造车时,围绕着同一个引擎,就能够制造出各种不同型号的车,而无需做大量重复的工作。 游戏引擎本质上就是一套按模块封装好的代码库和工具,游戏开发者只需要调用引擎中不同部分的接口,即可完成图形渲染、物理模拟、网络通信等任务,而无需再去进行相对底层和低级的编程,从而节省大量的时间,使之能够更好的专注于游戏设计和内容的创作。在商业游戏引擎领域,最常见的便是 Unity 和 Unreal。

1.2 全链上游戏引擎

随着玩家对游戏质量要求的提高和硬件设备性能的提升,目前 3D 游戏引擎的架构已经变得极其复杂,通常会包括模型编辑器、声音处理、光线渲染、物理模拟等等,重点往往会在画质的呈现,因为这类工作往往繁重,但对游戏的呈现又起到了至关重要的作用。 而全链上游戏则不太一样,目前全链上游戏的发展仍然非常的早期,开发者们普遍遇到的问题还是智能合约的部署和更新、不同合约间的可互操作性、客户端的同步模式等等涉及与底层区块链交互的问题。 因此,虽然全链上游戏的引擎同样是一套封装好的解决方案,但所聚焦的问题更多的是如何处理状态同步、如何在区块链环境下进行高效的内容增加和维护、如何更便捷的与其他合约做交互等等,以此来帮助开发者专注于游戏的部分,不需要过多的考虑如何兼容区块链,甚至从而降低 Solidity 的学习成本。 目前的全链上游戏引擎基本不涉及物理模拟、画面渲染等功能。

二、都在说的 ECS 是个什么?

当我们开始尝试了解全链上游戏引擎时,会发现经常出现一个叫 ECS 的名词,作为目前两大拿的出手的引擎 MUD 和 DOJO 都采用的架构,ECS 又是什么?

2.1 Enity-Component-System Framework(实体-组件-系统框架)

ECS 其实是一个在传统游戏行业中非常经典的框架,它是建立在通用引擎之上的一层,用于解决游戏对象之间的关系、交互和操作更新的一套模型。 其最早被 Scott Bilas 在 2002 年的 GDC 上提出,并运用在了当时开发的 ARPG 游戏《地牢围攻》中。由于其非常不错的性能表现,使其很快便得到的大量的关注,在后续的几年间,ECS 又衍生出了几个不同的变体,比较主流的则是 Adam Martin 于 2007 年在其*个人博客*中提出的对 ECS 的定义,基本成为了后续主流 3A 游戏所采用的框架。 随后在2015 年,苹果推出了其用于跨平台OS系统的游戏开发API框架 GameplayKit,在其中也包含了对 ECS 的实现。 而让游戏界更进一步接纳这种框架的,是《守望先锋》采用了该框架,并于 2017 年 GDC 上对其使用 ECS 框架的架构设计进行了演讲。在随后的 2018 年,头部游戏引擎 Unity 也正式推出了自己的 ECS 标准。

2.2 ECS 是什么呢

在 ECS 之前,游戏行业普遍采用的是 OOP(面向对象编程)的处理方式,即在 Class 类下面包含各种 Game Objects 游戏对象来继承 Class类的属性功能,从而建立整个数据架构。这种模式普遍存在几个严重的问题:

  1. 游戏对象间的关系,往往得在一开始就设定好 (这几乎不可能),否则当新类型对象出现,需要多个老类的功能时,往往很难进行继承;

  2. 随着游戏内容的增加,类会越来越多,维护起来十分麻烦;

  3. 对于引擎而言,模块非常多,而很多模块间并不相关,比如渲染并不关心网络连接,当所有属性都放到一个对象里的时候,性能必然会下降。 而 ECS 则换了一种思路,将所有的属性全部拆分成一个个的 Component 组件,例如血量、位置、元素属性等等;而 Entity 实体则仅仅是一串数据标识,用来标识某个特定的组件集,因此“玩家”这个标识背后对应的,则是 {"HP", "MP" ...} 等组件的集合,Entity 与 Component 都不存在运算逻辑,全部交由 System 系统来完成,比如运动系统来处理实体的移动部分、伤害系统来处理战斗的数值结算部分... 这里稍微借 Boreal Games 一篇文章中的例子来对比,假如现在要开发一个巨简单的,只包含石头、树木、敌人和玩家 4 种元素的游戏,传统的 OOP 实现是:

    https://p.ipic.vip/pi9euk.png

而采用 ECS 的实现:

https://p.ipic.vip/ebth94.png

由此可以看出,ECS 是一种非常模块化的数据管理框架,这种 ‘实体’ 的设计让游戏设计师不再需要每次都依赖程序员来调整游戏逻辑、各个实体间的关系可以更容易的做后续调整。 同时,在某种程度上,以太坊的网络也是类似的设计,如果我们将 Entity 变成 EOA,Component 变成 Asset,System 变成 Contract,会发现每个 EOA 下面有不同的 Assets,Assets 的交互又是在调用 Contract;这和 Entity 下有不同的 Components,Components 的交互又是在调用不同的 Systems 有着异曲同工之处。 当然,两者的设计肯定不能完全画等号,但也得以见得这种框架在以智能合约为功能集的环境中具有不错的适配性,这或许也是为数不多的全链上引擎基本都采用 ECS 框架的原因,而其中最为知名的必然就是 Mud 和 Dojo 了

三、MUD

3.1 MUD 背景