自制游戏引擎 - GameMachine (序)

来自专栏自制游戏引擎 - GameMachine7 人赞了文章

大概是在几年前,我在工作之余接触了计算机图形学,仿佛是打开了一个新世界的大门。于是,我开始决定利用自己的空闲时间,写一个游戏引擎,其出发点完全是觉得非常有意思,而且游戏引擎,所涵盖的面非常广泛,正好满足了自己的求知欲。我把这个引擎叫做GameMachine,希望它能够有朝一日成为真正能够产出游戏的机器,从目前看来,它的价值仅仅停留在学习阶段,而非真正的生产阶段,不过,对于一些简单的3D游戏,它还是能够胜任的。

GameMachine Demo截图

目前此项目托管在github上:

https://github.com/Froser/gamemachine?

github.com

欢迎大家fork,参考和学习。如果需要用于生产环境,请务必通知我。

在编写GameMachine的时候,我遵循著几点原则:

1、用尽量少的第三方库。很多基于OpenGL的引擎,作为教学,往往都会使用glut这样的库,因为它是支持跨平台的,并且功能比较完善。但是,GameMachine能够自己写的代码,都自己写。如目前GameMachine已经支持了Windows和X11下的窗口的渲染。只有自己实现,才能满足自己真正的需求。GameMachine用到的第三方库主要有zlib、glew、libjpeg、libpng、freetype等,这些库几乎用于所有需要图像渲染的工程,因此没有必要自己重新实现。

2、设计的时候要考虑到跨平台。GameMachine希望能够在各种平台上运行,目前已经能够在Windows和Ubuntu下跑起来(Ubuntu支持的特性目前不全)。因此,它抽象出了很多介面,适应于不同的操作系统。同时,它使用CMake来管理工程,使得任何常见的操作系统都能够构造解决方案。

3、要能够支持多种渲染引擎。GameMachine抽象了许多绘制的介面,这些介面已经用OpenGL或DirectX11实现。当然,它也可以支持更多的渲染引擎,如DirectX12和Vulkan。我在编写渲染代码时,十分重视它这种扩展的特性。

4、效率优先,大小其次。游戏引擎渲染出来的画面要尽可能流畅,本身exe大小大一点没有关系,毕竟和游戏资源比起来,exe的大小可以忽略不计了。因此,在编写的过程中,非常重视一些细节,如:是否能用移动构造代替拷贝构造,是否能避免多次分配内存,内存池是否合理,是否会有内存泄露。

我会在之后逐个来解释GameMachine是如何实现的。现在先来说一下,GameMachine能做一些什么事情:

渲染法线贴图

游戏场景渲染。GameMachine还原了雷神之锤3的场景,可以实现奔跑跳跃,支持手柄

物理引擎 (基于bullet3)

骨骼动画

基于PBR的渲染技术

UI框架

粒子系统

生成地形

目前,功能正在不断开发中。具体的架构和实现原理,我将会在后面的文章进行分析。

通过编写GameMachine,可以了解一下方面的相关知识:

语言方面:

1. 了解C++11/14许多特性。如auto, decltype,右值引用,move,完美转发,甚至还有模板元编程等。这些在代码中都非常普遍。

2. 深入了解各种容器,如vector, list, map, unordered_map等。它们的应用场景都不一样,一切是为了最优的效率。

工程方面:

1. 了解设计模式。为了支持多个渲染底层,以及多种操作系统,不得不在一些看似直截了当的功能中加入了一些抽象层,其中用得最多的是工厂模式。不同的渲染底层、操作系统,将会返回不同的实例。

2. 了解渲染的整个流程。这里指的是窗口的创建过程,消息循环和处理。为了解耦不同操作系统不同的消息机制,GameMachine自己封装了个事件类来传递消息(参考Qt)。

3. 了解图形渲染管道。在可编程著色管线中,OpenGL3和DirectX11其实是大同小异,因此可以抽象出它们通用的部分,这样上层渲染时就不必关心底层是用什么来渲染了。

当然,能够了解的知识真的太多了,这里不能一一列举。但是,我个人从写了GameMachine以来,受益良多,希望大家能够多多指教,github的主页有一个简陋的构建指南,如遇问题,请多多交流。


推荐阅读:
查看原文 >>
相关文章