资源描述
游戏服务器平台与动态库,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,游戏服务器平台与动态库,纲要,背景,从桥模式谈起,桥模式到平台,桥模式的一个变体,Module与动态链接,游戏平台效劳器的设计,总结,2,游戏效劳器平台与动态库,设计一个游戏平台效劳器,它统一管理并提供共有效劳给具体的小游戏,每个小游戏是一个模块,即动态库,每开发一个小游戏,只要写一个模块挂到平台效劳器即可,3,游戏效劳器平台与动态库,桥Bridge模式定义 :将抽象和实现划分开来,各自独立,但能动态的结合,桥Bridge模式意图:将抽象局部与实现局部别离,使它们都可以独立的变化,UML构造图:,4,游戏效劳器平台与动态库,代码例如,先定义Abstraction和Implementor,5,游戏效劳器平台与动态库,在定义,ConcreteImplementorA,和,ConcreteImplementorB,RefinedAbstraction,6,游戏效劳器平台与动态库,在桥模式中,抽象可以根据自己的需要来选择实现,这十分很有用,许多需要有多项选择择性的设计都可以采用这样的方式。例如定时器设计中,就可以采用这种方法,定义了定时器的抽象接口,然后按抽象接口的定义,我们可以实现十字链表定时器、堆定时器等,运用的时候,开发人员根据自己的需要选择用哪种定时器。,7,游戏效劳器平台与动态库,提供公有效劳的效劳器我们称之为平台性效劳器。,平台性效劳器分两类:,1、提供外部公有效劳,2、提供内部共有效劳,8,游戏效劳器平台与动态库,对我们所设计平台而言,它必须有动态选择模块的能力,而这正是桥模式说擅长,所以我们很容易把UML类图中左边局部,即Abstraction局部看成是平台,将右边局部,即Implementor局部看成模块,那对应后的UML类图变成:,9,将Platform、Module的关系用桥模式表达后,1、Platform可以动态灵活的选择Module,客户可以根据需要选择Module。,2、可以将开发分成两局部,一局部是Platform的开发,一局部是Module的开发,只要遵循PlatformInterface和ModuleInterface就可以。,3、Platform完成后,只要遵循ModuleInterface的接口定义,开发人员可以开发各自的Module,提供给Platform使用而不会造成什么麻烦。,桥模式到平台,10,但是,我们还遗漏一点,平台提供公有接口的能力怎么表达呢?,现在我在Platform新增一个给客户端发包的公有接口,提供给Module使用。但却发现具体Module没有途径使用Platform的这个接口,所以我们需要进一步的思考,将设计做一些修改。,桥模式到平台,11,再次回个头在看看再继续看看桥模式的UML图,发现Platform是通过module_来调用Module接口,那么用一样的方式,Module是不是也可以用指针来调用Platform提供的公有接口?答案是可以的。,桥模式的一个变体,12,至此,Platform就可以提供公有接口给Module使用了,Platform也可以调用Module的接口,哈,well!,桥模式修改后的这个变体很有意思,就像是两个桥模式复合而成的,有对称性。双桥模式double-bridge或者对称桥模式symmetry-bridge?,桥模式的一个变体,13,为什么要使用动态链接?,1、把Platform和Module在物理上进展分割,2、Platform和Module只通过抽象接口关联,动态链接的ABIApplication Binary Interface特性,只要承诺Platform和Module的抽象接口定义不被改变,就可以不关心Platform和Module的实现是否改变。,这里所指抽象接口定义就是PlatformInterface和ModuleInterface,我们可以将它们放在中,供Platform和Module使用。,Module,与动态链接,14,动态链接相关函数:,dlopen、dlsym、dlerror、dlclose,规定动态链接的入口函数,void CreateModuleLinker (ModuleLinker *,模块链接器ModuleLinker,其工作主要为:,创立module,摧毁module,取得module_id,用于唯一标识Module,Module,与动态链接,15,先定义,ModuleA,,即把之前,ModuleA,的代码抽取出来,放在文件中。,另外还需要定义它的模块链接器,ModuleLinkerA,。也放在文件中,然后用从编出,准备给,Platform,用,Module,与动态链接,16,ModuleLinker的管理,容易发现这是个创立型模式,用抽象工厂搞定它。,Module,与动态链接,17,将之前Platform代码抽取出来,放在中,Platform调用Module的例如,Module,与动态链接,18,游戏效劳器平台与动态库,小熊梦工厂的游戏业务需求要求多个游戏社区的用户,也可以在一起游戏,而游戏中的奖品要求带会社区效劳器使用。,而且游戏效劳器要支持游戏种类的扩展,先已经支持4个小游戏。自动撮合以及创立桌子的方式。,架构中,多台社区效劳器共用一个游戏效劳器,游戏效劳器有自己的积分,道具数据,的DB,而游戏的奖励通过社区效劳器给用户。,19,游戏效劳器平台与动态库,抽象出各个具体游戏实现公有属性和行为,定义和提供足够用的根底接口,效劳器模块进程,定义具体游戏实现必须实现的接口,实现平台定义必须实现的接口,实现自身游戏逻辑,具体游戏实现,通过接口与平台交互数据,模块管理器,将效劳器模块和具体游戏实现模块挂接起来,20,游戏效劳器平台与动态库,从物理上分割平台局部和模块局部,通过模块链接器关联起来,21,游戏效劳器平台与动态库,一个游戏桌动态绑定一个游戏模块,TableMgr负责管理游戏桌,包括创立和摧毁,模块管理器,即之前提到的ModuleFactroy,22,游戏效劳器平台与动态库,Table,提供一个,buffer,给,Game,对象,对象在此,buffer,上构造,重启恢复需要做两件事情:,定时器恢复,重建,table,上定时器即可,游戏数据恢复,因为对象有,virtual function,,还必须恢复虚表指针,vptr,23,游戏效劳器平台与动态库,编译器对没有声明拷贝构造函数的对象实行Bitwise Copy(位逐次拷贝),也就是简单的复制类中的每一个成员,此时编译器不会生成默认拷贝构造函数。但假设出现以下四种情况的任意一种,编译器将会生成一个拷贝构造函数:,当Class内含一个成员对象,而且这个成员对象声明有一个拷贝构造函数无论是被设计者声明或是被编译器合成,编译器会调用基类(Base Class)的拷贝构造函数构造;,如果类中含有虚函数, 编译器会重新设定vptr,而不是简单的拷贝其值。如果将一个对象复制同一种类对象时,复制vptr没有问题。但如果是将一个派生类对象复制给基类对象或者反之,复制vptr的值就是错误的。,如果类对象的继承链上有Virtual Base Class虚基类,当一个基类对象以一个派生类对象为初值的时候,需要重新设定vptr或者offset值,24,游戏效劳器平台与动态库,利用拷贝构造函数重新设定,vptr,的特性,现在我们就可以来恢复虚表指针,大致代码如下:,25,游戏效劳器平台与动态库,优点:,效劳器模块抽象各个具体游戏实现一样功能,以简化具体游戏实现的复杂度,提高具体游戏实现开发速度。,在接口稳定的情况下,具体游戏实现可以独立开发、编译、发布。,在接口稳定的情况下,具体游戏上线、下线、更新非常方便。提供运维命令重新加载游戏模块即可。,缺点:,逻辑设计相对要复杂,26,游戏效劳器平台与动态库,对于具有如下特性的效劳器:,业务逻辑多而杂,但可以分解出许多相对独立的子逻辑;,经常变更子逻辑,增删子逻辑;,都可以采用游戏效劳器的设计,抽象其一样逻辑功能,通过接口交互。,27,游戏效劳器平台与动态库,?设计模式?,?C+对象模型?,?C+ template?,?C+沉思录?,?stl 源码剖析?,?程序员的自我修炼?,?C+网络编程,卷1运用ACE和模式消除复杂性 ?,?C+网络编程,卷2,基于ACE和框架的系统化复用?,28,游戏效劳器平台与动态库,最后,29,Thank You !,不尽之处,恳请指正!,
展开阅读全文