atlas数据同步分析(inventory)

来源:互联网 发布:手游 知乎 编辑:程序博客网 时间:2024/06/06 09:17
1、atlas的inventory是一个包含UIAtlas_ContentSlot和UIAtlas_ContentButton的UIScene_Atlas_BaseScene,通过player的鼠标拖拽来实现换装;
2、UIAtlas_ContentSlot,UIAtlas_ContentButton和鼠标拖拽这里不做描述了,这里仅仅描述如何通过atlas来做各个客户端的装备同步;
3、所有与atlas的数据操作都是通过OnlineSubsystemAtlas对象进行,这里使用的inventory同步是通过AtlasOnlineSub.PlacePickedInInventory实现的,实例化OnlineSubsystemAtlas对象的代码如下
local OnlineSubsystemAtlas AtlasOnlineSub;
AtlasOnlineSub = OnlineSubsystemAtlas(class'GameEngine'.static.GetOnlineSubsystem());
PlacePickedInInventory内部代码如下
FString cmd = FString::Printf(TEXT("avatar item place inventory %d"), iSlot);
CConsole::Instance()->PushCommand(TCHAR_TO_ANSI(*cmd));
这里可以看出,实际上的实现需要解析cmd字符串;
4、每个进程都实例化一个CConsole对象,用子线程来处理cmd字符串,例如PushCommand就是加入cmd字符串到处理队列;
5、CConsole的处理队列m_vNewPendingCmds保存了当前要处理的CConsoleCmd接口指针,暂时没发现这个指针如何实例化的,子线程调用这个CConsoleCmd::Process接口,本例是CConsoleCmd_ClientAvatar实现;
6、下面跟踪CConsoleCmd_ClientAvatar发现CAvatar::HandleAvatarConsoleCmd这个解析cmd字符串的函数,根据不同cmd打包CPktItemNotify,最后通过CClientBase::ClientSend发送到cluster server;
7、cluster server的ServerHandleReceivedPacket收到一个带有ID_ALL_ITEM_NOTIFY标志位的包后,对包进行解码工作(霍夫曼算法),把包数据转换为一个CPktItemNotify对象,释放包空间后进入SrvPacketProcess_ItemNotify函数,在这里avatarid找到对应的cluster server上保存的的AVATAR对象CCSAvatar,然后比对了两者的IP来源是否一致,不一致则认为是恶意包,然后根据cluster server上的AVATAR数据找到对应的授权cluster node,将CPktItemNotify对象打包发送给此node;
cluster node收到包后也是进行解码操作和转换为CPktItemNotify对象。进入PeerPacketProcess_ItemNotify函数,根据包里的avatarid找到自己内存中的AVATAR对象CAvatar,如果没找到,就直接返回了。检查了包的子类型,发现是eItemNotifyMsg_Equip类型后,根据传入的装备ID和内存中的CAvatar对比,检查了此装备是否真的存在,然后检查用户那一栏是否确实是空白,然后调用GameHandler_ItemEquip函数。在这个函数里,首先检查命令字里有没有FAFC串,此串表明此装备的使用原则是First Available, First Compatible。然后检查特性标志位,检查装备的兼容性,检查级别,更新内存中的CAvatar对象属性,最后调用GameHandler_EquipmentRecompute执行换装后的一些属性值更新。
暂时没找到NODE如何把结果传给server的,猜想也许是异步的,在每tick后发送。
异步发送时,使用HasDirtyParams检查avatar参数有了更新,然后打了一个有ID_NODE_ITEM_UPDATE的包给服务器。
cluster server收到此包,使用IsRealmDBDirty检查是否有更新,这里会有数据库的update操作。调用PeerPacketProcess_ItemUpdate函数,在这里进行了GUID的检查,进入GameHandler_GiveNewItemToAvatar函数,这里会检查数据库看是否需要进行insert操作。最后将此包原样发送给客户端
8、cluster server的参数tick处理
cluster server维护一个CCSAvatar对象列表,每个CCSAvatar对象包含一个avatar对象和一个avatar到tracker的映射集合,这个映射集合实际上就是兴趣列表;
cluster server轮询CCSAvatar对象列表来查找兴趣列表的每个avatar对象,然后把自身维护的参数集合中有改变的部分拷贝出来,粘贴到tracker的参数集合中;
每个变化的参数都打一个独立更新包CClientAvatarParamUpdate,加入带宽管理的pendingupdate列表,带宽管理tick负责发送客户端
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 金立手机拍不了照怎么办 手术拆线后切口不平怎么办 乳牙透明冠掉了怎么办 配眼镜度数低了怎么办 眼睛高度近视怎么办才能恢复 猎人荒野的呼唤打中一枪后怎么办 凯恩帝数控超程报警怎么办 凯恩帝数控车床x向超程怎么办 别人问你借账号怎么办 微信成夜间模式怎么办 网络电视突然黑屏了怎么办 1adac连接线坏了怎么办 4g的标志没有了怎么办 苹果手机亏电了怎么办 苹果手机亏电了充不进电怎么办 比值审敛法 ρ=1怎么办 比值审敛法中p=1怎么办 电脑被老友重装系统搞坏了怎么办 vivo手机听筒声音小怎么办 小孩调皮幼儿园不收怎么办 小孩听力残疾幼儿园不收怎么办 幼儿园不收外省小孩怎么办 孩子刚上幼儿园哭闹老师怎么办 孕妇糖耐指标高怎么办 貂蝉经常没蓝怎么办 儿童声导抗c型怎么办 酱牛肉不烂怎么办拯救 卤牛肉一切就碎怎么办 牛肉煮的太烂了怎么办 牛肉卤的太烂怎么办 牛肉炖得太软怎么办 牛肉炖的很硬怎么办 牛肉做的有点硬怎么办 牛肉做老了还能怎么办 牛肉粒 炒老了怎么办 牛肉炖出来很硬怎么办 煮的牛肉太硬怎么办 在产蛋鸡体重偏轻怎么办 产蛋鸡不上高峰怎么办 蛋鸡天热下蛋少怎么办 成年鸡嗉子鼓涨怎么办