官方网站:http://korok.io
关于引擎
在官网上是这样介绍的:
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的部分责任进行分离。如下图:

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月份开始这个项目正式启动了。
中间有两次比较大的挑战,一次是设计底层的渲染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

网友评论