网站大量收购闲置独家精品文档,联系QQ:2885784924

QQ仙侠传技能系统实现.ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
QQ仙侠传技能系统实现

量子工作室 gloryliu(刘庆辉) 本文主要内容 SHM的简单介绍 SHM的主要特性 特性应用,TBUS组件 特性应用,状态数据 SHM使用中常见问题 SHM相关的故障总结 SHM的简单介绍 1)Linux提供多种进程间通信机制(IPC) 最初Unix:管道、FIFO、信号 System V:消息队列、信号量、共享内存 Unix BSD:socket套接字 2)共享内存(SHM)是最快的IPC形式 可以使用信号量实现同步互斥 5)Windows下的共享内存 文件映射 mmap SHM的接口和命令 1)SHM的函数接口 int shmget( key_t key, int size, int flag ); 创建或获取SHM void* shmat( int shmid, void* addr, int flag ); 映射到本地地址 2)SHM的相关命令 ipcs 查看系统内的SHM信息 ipcrm 删除指定的SHM SHM的主要特性 1)多进程间数据共享 TBUS消息中间件 2)数据可脱离进程存在 业务进程的状态数据 3)访问方式与普通内存一致 基本使用保持一致,但要关注一些细节和习惯 TBUS消息通道(本机) TBUS消息通道(跨机) TBUS的优势 1)高效的数据传输通道 SHM本身是最快的IPC形式 BUS通道的无锁实现(Lock free) 2)简单一致的接口方式 屏蔽网络概念,灵活部署 3)短时崩溃不会丢失消息 BUS内数据与访问进程保持独立 仙侠的服务器架构(全局视角) 1)单服单线结构 2)各服间无交互 3)单进程异步模式 仙侠的服务器架构(单服视角) 仙侠的服务器架构(SHM视角) SHM区域的整体规划 ZoneSvr启动时,进行SHM区域的初始化 1)SHM为预分配好的连续区域 各数据结构按顺序依次排布 排布时由CurPos指示当前的可用位置 3)各数据结构为定长结构 自行实现Pool的分配释放管理 不再从堆上malloc新的数据 尽量规避指针变量 SHM下的内存池结构 1)定长结构,占据SHM确定区域 2)分配和释放保证O(1)复杂度 3)对每个对象单元,提供统一ID机制 4)ID索引到对象的复杂度为O(1) 5)Placement new方式进行构造: new (buff) Object; 6)对象释放时显式执行析构 SHM下的内存块结构 1)内存块结构非常简单,就是全局的一个结构体 2)仙侠中通常以单件的形式进行使用 3)区别于传统单件模式,需使用placement new进行初始化 Resume重启时的关键处理 1)数据的一致性检查 attach时,需要确保前后数据结构一致 如内存池长度,单元大小 2)内存对象的重新构造 通过构造函数重设虚函数表指针 同时不能修改其他已有状态数据 3)非SHM数据的恢复 ZoneSvr存在着少量的非SHM数据,主要用于索引 如保存RoleID到Player映射关系的std::map Resume重启时从SHM数据中归结重建 SHM对象的构造函数 因Resume重启时的特殊要求,既要通过构造来重设虚函数表, 又要保证已有的数据不被清空,继续延用。 为此在构造函数内,需要对环境做出区分。 不安定的数据类型 1)std::string, std::vector, std::map 等 stl类型自行管理内存,尽量不在SHM上安置 SHM上通常使用定长数据类型 2)常规指针变量 重新attach后映射地址会发生改变 可使用对象ID、相对偏移、数组下标替代 如果必须使用,需在Resume时进行重设或修正 统一封装了SHM上的常用数据结构, CArray,CSortArray,CListNode,HashMap等。 编码时尽量避免从堆上自行分配数据, 状态数据均在SHM上存放和管理。 非状态数据,如临时变量和函数参数可自由使用。 不停机更新的实现—程序 1)程序支持Normal和Resume两种启动方式 2)SHM中只使用“安定”的数据类型 3)Resume启动前后数据格式保证严格一致 4)预分配区域的基本思路使得数据能够自然延用 不停机更新的实现—资源 1)资源的表示方式 不在对象身上直接存资源指针 使用[ ResID,ResIdx ]进行表示 2)资源查找算法 首先使用ResIdx

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档