atlas数据同步分析(inventory)

xiaoxiao2021-02-27  174

1、atlas的inventory是一个包含UIAtlas_ContentSlot和UIAtlas_ContentButton的UIScene_Atlas_BaseScene,通过player的鼠标拖拽来实现换装; 2、UIAtlas_ContentSlot,UIAtlas_ContentButton和鼠标拖拽这里不做描述了,这里仅仅描述如何通过atlas来做各个客户端的装备同步; 3、所有与atlas的数据操作都是通过On lineSubsystemAtlas对象进行,这里使用的inventory同步是通过AtlasOnlineSub.PlacePickedInInventory实现的,实例化On lineSubsystemAtlas对象的代码如下 local On lineSubsystemAtlas AtlasOnlineSub; AtlasOnlineSub = On lineSubsystemAtlas(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负责发送客户端
转载请注明原文地址: https://www.6miu.com/read-9921.html

最新回复(0)