这个专栏记录我从零开发一款 H5 游戏引擎的过程。
为什么开发游戏引擎?
大家好,我是刘不思,一名在游戏行业摸爬滚打十多年的程序员。身为游戏程序员,我一直有个想法,就是开发一款自己的游戏引擎,这个想法由来已久。
十年前,移动互联网浪潮兴起时,我辞职与朋友创办了一家游戏公司。最初,团队只有一名程序员,就是我。实打实的全干型,游戏的客户端、服务器端、运营后台网站、美术工具等等全是我一个人做。
在一个初创团队,我负责哪一块,不在于我擅长什么,而在于团队需要什么。这样的好处是我需要快速学习游戏开发的各方面知识,缺点是我无法深入了解某一个方面。
所以,这些年我的技术一直是广度有余而深度不足。日常工作中,我主要是使用游戏引擎,并未接触过引擎的底层开发。
随着公司的发展,团队越来越大,我的工作开始侧重管理:项目管理、团队管理。前几年,我们开启游戏发行业务,我又兼了半年商务。
不管我负责哪一块业务,始终没有脱离技术,始终没有放弃开发一款游戏引擎的想法。我并不指望能取代市场上现有的游戏引擎,只是想借着这次从零开始的机会深入理解游戏引擎。知其然,也知其所以然。
契机
最近,我写了一篇文章,尝试用游戏中的 Boids 算法说明股票投资中散户的行为。
在文章的初版中,我使用了 Github 上的开源代码 链接,但这个代码仅仅是一个临时性解决方案,完全没考虑扩展性和复用性。
如果我想再写篇文章展示各种寻路算法,那这段代码完全用不上。所以,我重构了代码,创建场景 Scene 类,将图片绘制封装入 Sprite 类等等。
重构后,项目代码渐渐有了一款游戏引擎的雏形。于是,我就想为何不以此为契机,开发一款 H5 游戏引擎呢?。
虽然我对于 Web 前端并不熟悉,但好在 H5 游戏大部分工作只需要与 canvas 打交道。
如果开发一款桌面端的游戏引擎,会涉及更多的 OpenGL 或 DirectX 等图形库的细节。而 H5 游戏引擎,canvas 封装了 WebGL 图形库,这使得我可以将更多精力放在引擎层。
简单起见,我打算先从一款 2D 游戏引擎开始。虽然是 2D,但仍避不开 3D 游戏引擎的数学知识,如矩阵变换。
整个开发过程,会遵循 MVP 原则,即先开发一个最小可行产品。先有,再好。
文章计划
游戏引擎是游戏开发的核心,为开发者提供了大量的工具和功能,包括图形渲染、场景管理、资源管理、输入处理等等。
我计划按以下主题,循序渐进地介绍这款游戏引擎的开发过程:
- 搭建开发环境
- 熟悉绘制功能
- 基础框架
- 帧循环
- 动画
- 鼠标事件
- 寻路算法
- 状态机
- 场景管理
- 数学知识
- 数学库
- 事件管理
- 资源管理
- Shader
- 粒子系统
- 音乐、音效
- UI
- 网络
- 物理引擎
这些主题覆盖了一款游戏引擎的主要功能,有的主题可能需要写多篇文章。开发过程中,可能会调整文章主题的顺序,或者增删部分主题。
在开发引擎的同时,我会遵从微软的 DogFooding 策略,基于该引擎开发一款游戏。游戏引擎和游戏的代码都会托管会在 Github。
总结
总的来说,从零开发一款游戏引擎是一件充满挑战但极具意义的事。我之前也没有经验,所以这次的经历以学习、实践为主。
即便如此,我仍然大胆地开了这个专栏。希望通过这个专栏,将我的经历分享给更多的开发者,同时也希望得到大家的反馈和指正。