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

原文地址:https://www.cnblogs.com/byfei/p/6389764.html