原文地址:https://twitter.com/hiCaptainZ/status/1656306576293244928
原标题:全链游戏引擎架构深度分析 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 中,动作是被动的,它们只有在区块链上发生了相关的交易时才会被触发并执行相应的操作。这种设计更好地适应了区块链的特性和需求。