文:JustinZhao twitter@hiCaptainZ

原标题:全链游戏引擎架构深度分析ECS和ARC

ARC的提出

JumpCrypto 在今年1月份提出了一种新的全链游戏引擎架构叫ARC(Action Registry Core),这里我来介绍ARC架构到底是什么以及它和ECS架构的区别和联系。

游戏引擎架构一般说来只有两种,OOP(面向对象)和ECS(面向数据)。因为随着游戏引入对象的增多,OOP在后期很难有良好的可扩展性,随后众多游戏引擎引入了面向数据的ECS架构(Entity Component System),我在之前的文章中介绍过ECS架构,这里不再赘述。因为传统游戏是loop-based,而全链游戏是push-based,所以JumpCrypto借鉴了ECS架构而提出了更适合区块链游戏的ARC架构。

ARC(Action Registry Core)架构是一种数据导向的方法,用于组织链上信息。在ARC中,实体(Entities)是不含数据的组件容器,组件(Components)是没有行为的数据类型,可以“附加”到实体上,动作(Actions)则是可以针对特定组件执行的功能。与传统的ECS不同,ARC考虑到了区块链架构的推送式特性,而不是传统游戏的循环式特性。动作负责链上游戏进度相关的状态更新,具体包括读取实体PDA和反序列化组件,以及修改序列化组件以更新实体。这种架构提供了可扩展性,可以随着游戏资产的增加和相互依赖性的提高而扩展,并避免了可能伴随面向对象编程方法而来的技术债务。

ARC和ECS的对比分析

那么ARC和ECS的异同究竟在什么地方呢?

它们都倾向于数据驱动的设计模式,相比于面向对象编程(OOP)有更高的效率和灵活性。

相同之处:

实体(Entity): 两者都有实体的概念。实体是一种唯一标识符,用于容纳组件。这些实体本身并不包含数据,而是通过附加组件来获取数据。

组件(Component): 在ECS和ARC中,组件都是纯数据类型,没有行为。组件可以附加到实体上,为实体提供数据。

不同之处:

系统(System) vs 动作(Action): ECS使用系统,而ARC使用动作。系统是一种函数,它与具有某些组件集的实体匹配。另一方面,动作可以对特定组件执行,而不是对整个系统执行。这是因为传统ECS基于循环的架构,适用于传统游戏,而ARC的动作包则考虑到区块链架构是基于推送的。

链下 vs 链上:ECS通常用于传统的、运行在本地或服务器上的游戏,而ARC则是为区块链上的游戏和资产设计的。因此,ARC需要处理的问题更具有挑战性,比如交易成本、数据存储限制和跨链操作等。

注册表(Registry): ARC引入了注册表的概念,用于跟踪注册的组件和能够修改特定组件的动作。这是为了实现更高的治理特性,以适应区块链的分散化特性。这是传统ECS不具备的。

上面的表述可能太抽象,我们举例来说明:假设我们正在制作一个战斗游戏,其中有两个实体:玩家和怪兽。每个实体都有一些属性,比如生命值和攻击力。

在ECS(Entity Component System)中:

实体(Entity): 玩家和怪兽都是实体。

组件(Component): 生命值和攻击力都是组件。玩家和怪兽实体都可以附加这些组件。

系统(System): 我们可以有一个“战斗系统”,当玩家和怪兽的位置相同时,这个系统会根据他们的攻击力和生命值进行战斗。这个系统会定期运行,检查所有满足条件的实体,然后更新他们的组件(比如减少生命值)。

在ARC(Action Registry Core)中:

实体(Entity): 同样,玩家和怪兽都是实体。

组件(Component): 生命值和攻击力仍然是组件。

动作(Action): 这里不再有系统,取而代之的是动作。例如,我们可以有一个“攻击”动作,当玩家选择攻击一个怪兽时,这个动作会被触发,减少怪兽的生命值。这个动作的执行是基于事件的,而不是周期性检查。

注册表(Registry): 这是ARC特有的概念。注册表记录了哪些动作可以改变哪些组件。例如,我们可以在注册表中登记,“攻击”动作可以改变“生命值”组件。只有在注册表中登记过的动作,才能改变相应的组件。

这就是ECS和ARC的主要异同。在ECS中,逻辑是通过系统以循环的方式运行的,而在ARC中,逻辑是通过事件触发动作来运行的。此外,ARC还添加了注册表这一层,为动作和组件之间的关系提供了更好的管理和灵活性。

游戏的循环和推送

传统的游戏是基于循环(loop-based)的,因为它们的核心运行机制是游戏循环。游戏循环是一个不断重复的过程,通常包含处理用户输入、更新游戏状态和渲染游戏世界这几个步骤。这个循环在游戏运行期间持续进行,通常每秒运行数十次到数百次,以保持游戏世界的流畅性。在这种架构中,游戏系统(如物理引擎、AI系统等)在每个循环中检查和处理它们关心的游戏实体和组件。

然而,区块链的架构是基于推送(push-based)的。区块链是一个分布式的数据库,它通过网络中的节点共享和存储信息。当一个节点产生一个新的交易(如转账、合约调用等)时,这个交易会被推送到网络中,其他的节点收到这个交易后会验证它并将它添加到区块链中。这是一个被动的过程,节点不会主动去查找新的交易,而是等待网络中的其他节点发送新的交易。因此,区块链的架构被称为是基于推送的。

这种基本的差异导致了ECS和ARC在设计上的不同。在ECS中,系统在每个游戏循环中主动处理它们的任务。而在ARC中,动作是被动的,它们只有在区块链上发生了相关的交易时才会被触发并执行相应的操作。这种设计更好地适应了区块链的特性和需求。