• 天龙八部服务器端共享内存的设计(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。

  • 相关阅读:
    Linux常用命令--清屏
    [LeetCode]Remove Duplicates from Sorted Array
    [LeetCode]Combinations
    [LeetCode]Search in Rotated Sorted Array II
    [LeetCode]Binary Tree Level Order Traversal II
    [LeetCode]Binary Tree Level Order Traversal
    [LeetCode]H-Index II
    [LeetCode]H-Index
    [LeetCode]Symmetric Tree
    [LeetCode]Remove Element
  • 原文地址:https://www.cnblogs.com/byfei/p/6389764.html
Copyright © 2020-2023  润新知