原文地址: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 中,動作是被動的,它們只有在區塊鏈上發生了相關的交易時才會被觸發並執行相應的操作。這種設計更好地適應了區塊鏈的特性和需求。