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负责发送客户端
2、UIAtlas_ContentSlot,UIAtlas_ContentButton和鼠标拖拽这里不做描述了,这里仅仅描述如何通过atlas来做各个客户端的装备同步;
3、所有与atlas的数据操作都是通过On
local On
AtlasOnlineSub = On
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负责发送客户端
阅读全文
0 0
- atlas数据同步分析(inventory)
- 基于Atlas实现mysql读写分离(1)--主从同步
- 数据同步案例分析
- inventory
- Inventory
- Inventory
- inventory
- Redis 数据同步机制分析
- Redis 数据同步机制分析
- Atlas学习手记(1):Hello,Atlas
- Atlas
- atlas
- Atlas
- atlas
- Atlas
- Foxmail地址本syncML同步 数据分析
- TFS数据块同步推送分析
- Redis数据增量同步优化可行性分析
- 项目协作平台 Project Fork
- Android Bitmap 会抛出 java.lang.IllegalStateException: only mutable bitmaps may be reconfigured
- 关于does not give a valid preprocessing token
- 静态编译qt-2009.03.1
- 1000笔记
- atlas数据同步分析(inventory)
- unreal engine3引擎的组成
- atlas的behavior分析之target scanner
- 内核timer使用
- 几个有效SNS网站推广方法
- SEO高手速成经验
- Windows 7的77条小知识
- 大型网站技术架构(二)--架构模式
- 装完Ubuntu 9.10后要干的事