atlas数据同步分析(inventory)

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负责发送客户端

你可能感兴趣的:(game&,ue3&,atlas)