zoukankan      html  css  js  c++  java
  • 天龙八部服务器端共享内存的设计(2/3)

    六、样例分析——玩家角色数据的存储和共享

    服务器端玩家角色对于的类型是class Obj_Human,里面有角色数据库存储接口的定义:

    protected:

    //存放所有关于Obj_Human的、从数据库里读取的信息

    HumanDB m_DB;

    class HumanDB中拥有内存共享对象指针,以及角色需要存储的数据定义。

    private:

    //共享内存相关数据

    HumanSMU* m_HumanSMU; //共享内存数据

    HUMAN_DB_ATTR_FLAG* m_AttrFlag; //角色属性刷新控制数据

    private:

    _HUMAN_DB_LOAD* m_dbHuman ; //角色基本信息

    _BAG_DB_LOAD* m_dbBag ; //角色背包物品信息

    _EQUIP_DB_LOAD* m_dbEquip ; //角色装备信息

    _BANK_DB_LOAD* m_dbBank ; //角色银行物品信息

    _SKILL_DB_LOAD* m_dbSkill ; //角色身上拥有的技能信息

    _COOLDOWN_DB_LOAD_FOR_HUMAN* m_dbCooldown ; //角色身上的冷却信息

    _RELATION_DB_LOAD* m_dbRelation; //角色联系人(好友、黑名单)

    _ABILITY_DB_LOAD* m_dbAbility; //角色学会的生活技能信息以及配方表

    _XINFA_DB_LOAD* m_dbXinFa ; //角色学会的心法信息

    _IMPACT_DB_LOAD* m_dbImpact ; //角色身上所施加的附加效果信息

    _MISSION_DB_LOAD* m_dbMission; //任务列表

    _SETTING_DB_LOAD* m_dbSetting ; //设置数据

    _PRIVATE_INFO_DB_LOAD* m_dbPrivateInfo;//私人信息

    上面这些xxx_LOAD很眼熟,其实在struct HumanSMU里面有类似定义:

    struct HumanSMU

    {

    SMUHead m_SMUHead;

    HUMAN_DB_ATTR_FLAG m_AttrFlag; //角色属性标志位

    _HUMAN_DB_LOAD m_HumanSM ; //角色基本信息

    _BANK_DB_LOAD m_BankSM ; //角色银行物品信息

    _SKILL_DB_LOAD m_SkillSM ; //角色身上拥有的技能信息

    _COOLDOWN_DB_LOAD_FOR_HUMAN m_CooldownSM ; //角色身上的冷却信息

    _XINFA_DB_LOAD m_XinFaSM ; //角色学会的心法信息

    _IMPACT_DB_LOAD m_ImpactSM ; //角色身上所施加的附加效果信息

    _ABILITY_DB_LOAD m_AbilitySM//角色学会的生活技能信息以及配方表

    _MISSION_DB_LOAD m_MissionSM//任务列表

    _SETTING_DB_LOAD m_SettingSM//任务列表

    _PET_DB_LIST_LOAD m_PetListSM//宠物列表

    _BAG_DB_LOAD m_BagSM; //角色背包物品信息

    _EQUIP_DB_LOAD m_EquipSM; //角色装备信息

    _RELATION_DB_LOAD m_RelationSM//角色联系人(好友、黑名单)

    _PRIVATE_INFO_DB_LOAD m_PrivateInfoSM;//私人信息

    };

    再看看HumanDB如何初始化的,看其构造函数(代码太多,删除了一些):

    HumanDB::HumanDB( )

    {

    //这里获取共享内存存储单元

    HumanSMUpSMU = g_HumanSMUPool.NewObj();

    m_HumanSMU = pSMU;

    m_AttrRegSM = new HUMAN_DB_ATTR_REG;

    m_AttrReg = new HUMAN_DB_ATTR_REG;

    m_AttrFlag = new HUMAN_DB_ATTR_FLAG;

    m_dbHuman = new _HUMAN_DB_LOAD ;

    //...略过一些对象内存分配

    //属性表和DB数据的挂接,用于脏数据判断和数据位置对接

    _RegisterDBAttributes();

    //属性表和内存共享对象挂接,用于脏数据判断和数据位置对接

    _RegisterSMAttributes();

    }

    1. Human数据的加载是通过DBCharFullData进行的,检查了一下代码,加载的地方只有两个地方,一个是创建角色的消息响应,另外一个地方是角色登录消息响应,这些都是LonginServer(登录服务器)处理的。

    ServerLoginPacketsCLAskCreateCharHander.cpp

    ServerLoginPacketsWLRetCharLoginHandler.cpp

    角色数据被加载后,发给了WorldServer,又通过WorldServer发送给GameServer。

  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/byfei/p/6389764.html
Copyright © 2011-2022 走看看