前言

不只是阅读《游戏引擎架构》的笔记,更多的是做引擎时的心得。

项目管理

版本控制、项目构建等等其它方面的工具自选就行,好用就完事了。

引擎核心层

引擎入口

建立 Engine 的基类,同时在 main/WinMain 中创建 Engine,将其编译成 Lib 库后暴露给编辑器,编辑器通过继承 Engine 类以实现对引擎的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Editor : public Engine
{
public:
Editor() {};
~Editor() {};

private:
};

Engine* CreateEngine()
{
Editor *editor = new Editor();
return editor;
}

实例化引擎顺序

书里面说要注意,但我觉得还好,不容易崩,实在不行就用书里面的优先级队列吧。

不过引用友元也是会初始化的,所以最好还是在 PreInit 或者 Init中完成。

事件

日志管理和计时器

这种都是自己想怎么弄都行,不会消耗太多性能,不同的日志和计时器和效果也不一样。

内存管理、GC 和字符流

建议自己写,不过不用这么早,放到后面当优化点行,字符流也可以考虑用 QString

容器

自己写工作量太大了,以优化 STL 为主(增加算法)。

引擎资源层

数据库

模型导入

看看这张图吧。

直接从这里复制了。

  • 和材质和网格(Mesh)一样,所有的场景/模型数据都包含在Scene对象中。Scene对象也包含了场景根节点的引用。

  • 场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列指向场景对象中mMeshes数组中储存的网格数据的索引。Scene下的mMeshes数组储存了真正的Mesh对象,节点中的mMeshes数组保存的只是场景中网格数组的索引。

  • 一个Mesh对象本身包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质。

  • 一个网格包含了多个面。Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)。一个面包含了组成图元的顶点的索引。由于顶点和索引是分开的,使用一个索引缓冲来渲染是非常简单的(见你好,三角形)。

  • 最后,一个网格也包含了一个Material对象,它包含了一些函数能让我们获取物体的材质属性,比如说颜色和纹理贴图(比如漫反射和镜面光贴图)。

引擎功能层

在这里核心层和功能层的分界并不明确,比如渲染功能的接口是要在核心层(平台层)封装的,而调用则在功能层。

渲染

渲染架构

渲染层级

需要一个渲染 Layer 以及一个储存 Layer 的容器,比如栈或者优先级队列。

渲染层级很重要,有了它才可以绘制透明物体,制作特效以及 UI 等等。

渲染管道

这样的渲染管线示意图对程序员更友好。

引擎工具层

最重要的就是反射(数据解析)了。