關於Korok2D遊戲引擎

關於引擎

在官網上是這樣介紹的:

Korok Engine is a free lightweight, cross-platform, component-based 2D game engine written in Golang and released under the zlib license. Greatly inspired by bitsquid blog.

這裡面提到的幾個關鍵詞:引擎、組件和Golang,每一個都有可能成為爭議點。

引擎之爭主要源於對引擎的定義,因為大家對「引擎」二字都會非常較真,比如沒有XXX和XXX所以不能叫引擎。我對引擎的定義是分階的,可以參考我之前的一個回答 - 如何評價雲風的《是時候啟動一個為移動設備設計的 3d 引擎項目了》?, 而korok僅算是1階左右的引擎而已。

第二個爭議點是組件化,通常提到組件化的時候都會提到ECS系統,我對ECS系統有過一段調研,結論是:ECS是一個非常模糊的概念。不同的人都會有不同的理解,所以網上也有很多ECS-like的框架,我們的引擎也是其一(並不堅持ECS的固有概念)。所以我只說是組件化的系統,另外組件化的設計是現代引擎設計的趨勢,我不想在重新發明一個Golang版本的Cocos2D。

最後是Golang,很多人認為 Golang 是不能做 GUI 的,況且15年的時候還有一個失敗的GUI項目 google/gxui, Golang社區也有很多人對此持懷疑態度,解決這個問題的最好的方式不是爭論而是看結果。

關於架構

Korok引擎是一個 Component/Table/System 系統,這三個關鍵詞可以描述引擎的架構。相對來說 Cocos2D 是一個節點系統,當我們提到 Node 的時候有經驗的開發人員立刻會想到它的大概架構。而ECS系統一般的設計思路是把Component的管理放在System裡面的,而我們是把Component的管理放在Table裡面,這樣可以對數據的存儲進行合適的優化同時和System的部分責任進行分離。如下圖:

Component/Table/System

Game管理所有的System,System管理不同的Table,Table管理不同的遊戲組件。每個Table/System之間沒有互相依賴。典型的代碼下(新建一個精靈):

id, tex := assets.Texture.GetTexture("assets/face.png")face := korok.Entity.New()sprite := korok.Sprite.NewComp(face, assets.AsSubTexture(id, tex))sprite.SetSize(50, 50)xf := korok.Transform.NewComp(face)xf.SetPosition(mgl32.Vec2{100, 20})

這種操作有點像向資料庫的表中插入數據,所以命名為XXXTable也有類似的意思。這種設計理念貫穿了整個引擎的各個模塊,所以如果需要擴展引擎都需要實現這三個模塊。

設計的原則是面向數據,系統解耦,所以你會看到幾乎所有的數據都會保存在一個大的數據塊裡面通過Table來管理,對外只提供增刪改查的方法,沒有任何系統邏輯(這樣還有一個額外的好處,因為內存是連續的所以可以提高CPU緩存的命中率)。至於Table中的數據如何使用是由上層的System來決定的。

關於開發歷史

15年的時候,我便在業餘時間開發遊戲,當時我的首選語言便是 Golang,主要是因為是它自帶垃圾回收這樣開發速度會很快(非腳本語言愛好者)。我調研了 Golang 的遊戲引擎後發現了 Engo 項目,在當時它應該是所有基於 Golang 的遊戲引擎裡面完善度最高的了(如果現在看來當然是 korok.io了)。

當時我的計劃是寫十個不同類型的小遊戲,這樣可以對不同類型遊戲的技術有些積累。因為如果以後真的以此為業,上了快車道就沒時間再做這種純技術研究。在寫第6個遊戲的時候,我逐漸發現了這個引擎的不足,比如不支持Batch,不支持補間動畫,音頻系統聊勝於無. 而且像任何一個開源項目一樣,認真讀完它的源碼之後會發現,它並沒有看上去那麼好。於是,我便萌生了一個想法。我向來有耐心和決心來完成我想做的東西,於是從16年5月份開始這個項目正式啟動了。

https://www.zhihu.com/video/954051207916900352

(當時用engo寫的一個三消遊戲)

中間有兩次比較大的挑戰,一次是設計底層的渲染API,一次是合併不同的系統。前者我用了很久才從 bkaradzic/bgfx 那裡偷師了基於排序的無狀態渲染API的設計技巧(保持了bgfx的API設計但是重寫了隊列和資源管理),後者因為無法解決不同系統的交互和耦合問題,曾經停工很長時間,直到設計出 Component/Table/System 這種架構之後才得到妥善的解決。

現在它們都能很好的工作。餘下的事情就是填充各個模塊的具體的代碼。

關於現在

korok已經發了兩個版本:alpha 和 beta,都不是正式版本。alpha版本實現了核心的架構,主要用來驗證我的一些想法是否可行。beta版本補全了功能,但是代碼不夠漂亮還有些hardcode的代碼、未完全實現的功能和bug。總之必須到1.0之後才會有一個穩定可用的版本。但是我覺得現在可以做一些宣傳性的工作,這樣等我們發布1.0版本的時候就會積累一些嘗鮮用戶了。

我們對標的引擎是Cocos2D-X,因為Cocos2D-X走IDE+js路線之後必然會丟失一些原生引擎開發者,而我希望能夠填補這塊市場(或許能夠吸引一些閑錢來支持繼續開發)。

這是專欄的第一篇文章,之後會以每月1-2篇文章的方式,寫寫引擎開發的相關東西,包括引擎開發中遇到的問題,各個模塊的設計等等。

歡迎訪問:korok.io


推薦閱讀:

遊戲開發之伺服器技術選型淺析
《流放之路》、觸發器、編程
讓角色半透明:樹形結構(三)
我的世界手游末地傳送門框架在哪兒?末地傳送門框架怎麼找?
從《萌王》看國內CP 亂象

TAG:遊戲開發 | 獨立遊戲 | 遊戲引擎 |