游戏引擎架构阅读笔记
前言
不只是阅读《游戏引擎架构》的笔记,更多的是做引擎时的心得。
项目管理
版本控制、项目构建等等其它方面的工具自选就行,好用就完事了。
引擎核心层
引擎入口
建立 Engine 的基类,同时在 main/WinMain 中创建 Engine,将其编译成 Lib 库后暴露给编辑器,编辑器通过继承 Engine 类以实现对引擎的配置。
1 | class Editor : public Engine |
实例化引擎顺序
书里面说要注意,但我觉得还好,不容易崩,实在不行就用书里面的优先级队列吧。
不过引用友元也是会初始化的,所以最好还是在 PreInit 或者 Init中完成。
事件
日志管理和计时器
这种都是自己想怎么弄都行,不会消耗太多性能,不同的日志和计时器和效果也不一样。
内存管理、GC 和字符流
建议自己写,不过不用这么早,放到后面当优化点行,字符流也可以考虑用 QString。
容器
自己写工作量太大了,以优化 STL 为主(增加算法)。
引擎资源层
数据库
模型导入
看看这张图吧。
直接从这里复制了。
和材质和网格(Mesh)一样,所有的场景/模型数据都包含在Scene对象中。Scene对象也包含了场景根节点的引用。
场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列指向场景对象中mMeshes数组中储存的网格数据的索引。Scene下的mMeshes数组储存了真正的Mesh对象,节点中的mMeshes数组保存的只是场景中网格数组的索引。
一个Mesh对象本身包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质。
一个网格包含了多个面。Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)。一个面包含了组成图元的顶点的索引。由于顶点和索引是分开的,使用一个索引缓冲来渲染是非常简单的(见你好,三角形)。
最后,一个网格也包含了一个Material对象,它包含了一些函数能让我们获取物体的材质属性,比如说颜色和纹理贴图(比如漫反射和镜面光贴图)。
引擎功能层
在这里核心层和功能层的分界并不明确,比如渲染功能的接口是要在核心层(平台层)封装的,而调用则在功能层。
渲染
渲染架构
渲染层级
需要一个渲染 Layer 以及一个储存 Layer 的容器,比如栈或者优先级队列。
渲染层级很重要,有了它才可以绘制透明物体,制作特效以及 UI 等等。
渲染管道
这样的渲染管线示意图对程序员更友好。
引擎工具层
最重要的就是反射(数据解析)了。