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