六、样例分析——玩家角色数据的存储和共享
服务器端玩家角色对于的类型是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( )
{
//这里获取共享内存存储单元
HumanSMU* pSMU = 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。