宝博体育- 宝博体育官网- APP下载 BaoBoSports大型游戏项目中的C++:一个基于template和hash算法的Event Id生成方案
栏目:哈希游戏 发布时间:2026-01-04
  宝博体育,宝博,宝博体育官网,宝博app下载,宝博体育网址,宝博体育官方网站,宝博体育注册,宝博体育靠谱吗,宝博体育登录,宝博体育入口,宝博体育注册,宝博官方网站,宝博APP,宝博注册,宝博网址   我们知道一般在大型的游戏项目中都会存在一个用于在各个模块建通信的模块,即事件(Event)系统,有时候也可以叫消息(Message)系

  宝博体育,宝博,宝博体育官网,宝博app下载,宝博体育网址,宝博体育官方网站,宝博体育注册,宝博体育靠谱吗,宝博体育登录,宝博体育入口,宝博体育注册,宝博官方网站,宝博APP,宝博注册,宝博网址

宝博体育- 宝博体育官网- 宝博体育APP下载 BaoBoSports大型游戏项目中的C++:一个基于template和hash算法的Event Id生成方案

  我们知道一般在大型的游戏项目中都会存在一个用于在各个模块建通信的模块,即事件(Event)系统,有时候也可以叫消息(Message)系统,该系统充当着模块胶水(glue)的作用。而在实现事件系统时,必将会面临Event Id要如何生成的问题。作为“大型游戏项目中的C++”主题的第一篇,我想介绍我在读的这个项目种是如何利用

  一般常见的Event Id有这么两种方式,一种就是直接定义枚举类型,如下的代码所示:

  这两种方式看起来是很直接方便,但是对于大型的项目来说有不少的缺点。首先,每次我们定义一个Event类型,除了要定义Event类型本身,我们还要额外考虑定义一个对应且必须保证唯一的Event Id。其次,考虑到不同的模块都要定义Event Id,而不同的模块一般都是由不同的项目组负责,当多个项目组同时修改同一个文件的时候,在源代码管理上是简直就是灾难。另外,EventId.h文件一变动,所有引用到的模块都要全部重新编译,这一点在小项目里可能不是什么问题,但是在大项目中所需要的时间成本是相当的大,如果你曾经尝试过编译虚幻引擎的话,你会和我感同身受的。

  这里我们介绍一种基于template和hash算法的Event Id实现。首先我们将Event id定义为一个无符号整数:

  我们通过计算Event符号名的hash值来得到具体的Event Id,同时在一定程度上保证唯一性。hash算法如下代码所示:

  那么怎么获得Event的符号名呢,很简单利用C++宏运算符#,如下代码所示:

  但其实上面定义的这个宏用起来也挺麻烦的,我们用的时候还需要记住它是一个函数调用,还要把结果保存起来,比如这样:

  考虑到Event id经常会出现在函数的参数中,首先这种方式写起来就麻烦,其次每次都还要计算,性能也是一种损失。这里我们利用template特化这一语言特性来规避这些问题,首先我们定义一个模板函数GetEventId:

  我们要注意的是我们不会直接调用这个GetEventId默认实现,而是调用具体的Event对应的特化实现,为此我们定义一个特化模板函数GetEventId的宏,如下所示:

  当定义Event类型时,利用该宏了得到一个模板函数GetEventId的特化实现,如下所示:

  当我们需要获得具体Event类型的EventId时,就可以直接调用模板函数GetEventId了: