棋牌游戏永久网址【363050.com】

开元棋牌

开元棋牌

联系我们

电话:400-123-4567

手机:138-0000-0000

邮箱:admin@youweb.com

地址:广东省广州市天河区88号


哈希游戏

大型游戏项目中的C+棋牌游戏- 棋牌平台- APP下载+:一个基于template和hash算法的Event Id生成方案

  • 作者:小编
  • 发布时间:2026-01-04 16:07:12
  • 点击:

  棋牌游戏大全,棋牌游戏app,棋牌游戏平台,棋牌娱乐,棋牌娱乐平台,棋牌,开元棋牌,斗地主,扑克游戏,麻将,德州扑克,牛牛,麻将糊了,掼蛋,炸金花,掼蛋技巧,抢庄牛牛,十点半,龙虎斗,21点,牌九

大型游戏项目中的C+棋牌游戏- 棋牌游戏平台- 棋牌游戏APP下载+:一个基于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了: