2021SC@SDUSC
开源游戏引擎 Overload 代码模块分析 之 OvTools(一)—— Eventing(包含 OvTools 模块的概述)
前言
从本文开始,笔者将系列化地对 Overload 中 OvTools (工具模块)进行分析。若想先大致了解该引擎各个大模块,可前往笔者上一篇相关文章查看。
现在,让我们先了解 OvTools 的大纲吧:
OvTools 工具模块概述
这是 OvTools 包含的文件夹:
可以观察到,它包括了四个相对独立的小模块:Eventing、Filesystem、Time、Utils,也展示了 OvTools 的功能:事件、文件系统、时间系统及其余多种工具(例如随机数生成、系统调用等)的集合。
接下来,我们先解析其中的 Eventing 事件模块,采用文件顺序分析的方式,能更好地理解作者编码的思路;其他模块将在后续文章中探究。(PS:OvTools 的引用与外部依赖项多是所需的 std 库等等的文件,笔者将不多赘述。)
分析
1、Eventing 模块概述
该模块的功能如其名,包含一组有关回调的函数事件,负责处理各种回调。它包括了下列文件:
替不熟悉编译文件的读者解释一下,其中 .inl 文件是内联函数定义文件。为了避免 .h 文件过长等,我们会将所有的内联函数定义移入该文件,然后再用 #include 指令包含到类声明后面(该引擎是放在类头文件底部);所以命名上,也多与头文件相同。
2、Event.h
2.1 头文件
我们先看该模块包括的头文件(仅有一个):
#include <functional>
这是 C++ 标准库中的一个头文件,定义了 C++ 标准中多个可用于表示函数对象的类模板,包括基础算法(除法、乘法等)、逻辑算法(and、or等)等等。其中,类的实例可以直接当作函数调用。
2.2 Event 类
该小模块的主体是 Event 类,该类是包含在 namespace OvTools::Eventing 命名空间下的。顺便在此一提,在 OvTools 所有的小模块中,所有的主体代码都是在各自模块的命名空间下写的,所以笔者此后将不再列出命名空间的代码了。
现在来看 Event 类,不过在类的定义之前:
namespace OvTools::Eventing
{
/**
* The ID of a listener (Registered callback).
* This value is needed to remove a listener from an event
*/
using ListenerID = uint64_t;
/**
* A simple event that contains a set of function callbacks. These functions will be called on invoke
*/
template<class... ArgTypes>
class Event
{
代码作了一个重命名,将 uint64_t 类型重写为监听器的 ID,使得该类型的声明在该命名空间中更为直观;代码还作了参数模板,允许按需求分配参数个数(C++ 的 … 代表参数个数自定义)。
而关于 Event 类,都是各种函数的声明,且作者非常贴心地做了注释,代码如下: