Explosion 开发笔记 (一)

2022-08-12 14:12:30 浏览数 (2)

Explosion 是我新开发的游戏引擎,GitHub 地址在这里: Explosion,预计是一个大大的工程,我也将持续开发与维护,欢迎志同道合的朋友加入与我一同创造新的游戏秩序。我会在博客中持续更新自己开发过程中的一些心得与思考,欢迎大家关注,Explosion 的故事将由此开始。

为什么要做 Explosion

其实早在上大学那会,我就对计算机图形学和游戏开发有着浓厚的兴趣,大一的时候使用过 Unity 和 Unreal 开发过游戏,在计算机图形学课程设计中,也使用过 OpenGL 2.0,当时大二大三那会接触到了 Web 开发,后来就一直沉迷于 Web 无法自拔了。

机缘巧合下,我的工作却恰好又是跟图形学相关,第一次接触可编程渲染管线(那会是使用 OpenGL)的时候,我仿佛打开了新世界的大门,复杂的游戏场景原来都是由这样的原语构成。

加上自己的兴趣爱好(当然是电子游戏!)使然,组织架构调整的时候我毅然加入了实验室的渲染引擎组,开始参与渲染引擎的开发。

再后来我接触到了 Vulkan、DX12、Metal 等更现代的 GraphicsAPI,同时也逐渐了解了硬件的工作原理,也逐渐理解了游戏底层神秘的引擎到底是怎么运作的,兴趣越来越浓。

俗话说的好,认识一门技术最好的方法就是造轮子,于是我义务反顾地投入了游戏引擎开发大军。

谈谈前辈们

我心目中的游戏引擎一哥当然是 Unreal,老二是 Unity,全封闭的引擎生态这里就不提了。

Unreal 的优点当然是不需要做很多的额外开发,就能获得相当不错的画质效果,相反,缺点则是如果你不是很懂一些渲染的原理,Unreal 对你将会很不友好,很多时候,读它给的文档不如直接读源码。另外如果要加一些自己的扩展特性的话,一旦涉及到渲染管线,大概率要改代码然后再源码编引擎,不过,Unreal 自己的意思也很明确了,老子开源,给你看你不会改,怪谁?

Unity 的话,对开发者的友好程度就要好很多了,文档、资料、教程相当多,C# 写起来也相对比较舒服。Unity 的画质不自己搞的话也就那样了,不过 Unity 也说了,我扩展性这么高,你自己不会写,怪谁?

另外,值得一提的是,针对新的游戏架构 ECS,Unity 在这方面应该算是先驱了,自己已经弄了一套 ECS 的 Preview 接口了,有空可以详细聊聊 Unity 的 ECS。

Unreal 和 Unity 的源码我都读过一部分,Unreal 和 Unity 只能说这种体量的东西是工程界的奇迹,只要架构没有腐坏到无可救药的程度,哪怕局部屎再多也能糊住,多数情况下,它们的代码看起来就是微观来看简直屎的不行,但从宏观架构来看还能过得去。

再下来我了解到的一些引擎有 CryEngine、Cocos、Godot、KlayGE 等。

CryEngine 的代码简直可以用灾难来形容,在其上搭建的 Amazon Lumberyard 也是一个灾难,相信我,只要你看一眼它的 CD3D9Renderer 你就知道我在说什么了。CryEngine 的文档也很差劲,不过好像它的忠实拥趸还挺多,但据我所知,买过它来做游戏的育碧和 EA 都跑路了,CryEngine,把你弄哭的引擎。

Cocos 的代码我没有读过,在国内流行度其实还算可以,早年只做 2D,近期开始投入 3D Creator 的开发,完成度还不够,不过 Cocos 的劣势在于其专攻在 Web 和移动端,使用的 GraphicsApi 是 WebGL。GL 系的 GraphicsApi 其实限制了引擎的发挥,而 WebKit 的设计上,GraphicsApi 目前来说又只有 WebGL 可以选用,因为可汗组织推出的 WebGPU 标准还未完全投入使用,可以期待 WebGPU 和 WebAssembly 的普及可以让 Cocos 这类的引擎用上 Vukan、DX12 和 Metal。

另外的引擎就算比较小型的了,Godot、KlayGE 一类的,东西越小越好维护,代码越简单。虽然引擎本身可能并不适合商用,但很适合开发者去学习原理。

我对 Explosion 的期待其实很简单,就是遵循前辈们开辟的道路一步步前进,取其精华去其糟粕,慢慢打造属于自己的引擎,不求以后能怎么样,但求能把功能做完整、做精致。

初步计划

先抛开 IDE 不看,目前来看近期要做的最基础的功能如下:

  • Render Hardware Interface (RHI)
  • Render Pipeline Interface (RPI)
  • ECS
  • Material System
  • Game Runtime
  • Game Script System

先看前三项,RHI 层的作用很简单,就是抽象不同的 GraphicsApi,对 RPI 层提供统一的接口,目前我打算封装的 GraphicsApi 只有 Vulkan、DX12、Metal,其他的老一点的 Api 就不打算封了,推动技术前进的最好方法就是不要去兼容腐坏的技术。

RPI 层封装渲染管线接口,在我的理解中,就是 Renderer 的核心逻辑的抽象。

ECS 是对外的逻辑接口总线,分为 Entity、Component、System 三块,我的目标是做成标准的 ECS,带内存管理的那种,高效利用 CPU Cache 的性能优势。目前准备直接集成 entt 开源库,日后可能自己再写一套。

Material System,其实这是一大难题,多数引擎的做法是提供预制材质和自定义材质,不过自定义材质的封装感觉都很别扭,看看日后自己能不能在这方面找到突破。

Game Runtime,游戏运行时,简单来说就是诸如 GC、反射一类的基础功能,对上会直接承接 Game Script System,对下承接 ECS。这块可以参考 Unreal 老大哥的做法,不过要写的更精简些。

Game Script System,脚本系统,需要选择一种语言集成,按我的喜好来看,JavaScript / TypeScript 当然是首选,不过有了反射系统的机制,无论哪一种语言其实都很容易集成进来。


最后,写给自己和 Explosion,加油。

0 人点赞