GS发包到MS(GS,MS包交互过程)
例:人物上线
首先看看其实如何确定是哪张地图的
数据库首先只保存一个mapid
在share初始化的时候已经初始化了所有map,并保存了map的指针信息,其key就是mapid
if(rActorEx.GetMapID() <= )
rActorEx.SetMapID();
int mapID = rActorEx.GetMapID();
rActorEx.m_nBodyID = m_pShare->TGetnBodyId(rActorEx.GetProf(), rActorEx.GetSex());//现在那个bodyid用到了 m_pMap = m_pShare->GetMapByMapId(mapID);//通过mapid就能获得map指针信息
if(!m_pMap)
{
m_ActorId = ;
return;
} m_pMap->Gs2MsData(gs2ms_add_player, m_nChannelId, (void*)&rActorEx, sizeof(rActorEx));//传入MS,m_pMap即玩家所在地图指针
void Map::Gs2MsData(int cmd, int channel_id, void* data, int len)
{
MapPkt pkt;
pkt.channelId = channel_id;
pkt.data = m_memPool.popPkt(len);//从内存池中分配一块内存出来,以前用的new,然后这个new很容易失败的
memcpy(pkt.data, data, len);
pkt.len = len;
pkt.cmd = cmd; PushPkt(pkt);
}
//接下来就是起的线程的作用了
void ThrTransData::PushPkt(MapPkt Pkt)
{
#ifdef BOOST_LOCKFREE
for (;;)
{
if(m_gs2msPkts2.push(Pkt))//将这个包放入无锁队列中
break;
cxx11::this_thread::interruptible_wait();
}
#else
{
cxx11::lock_guard lock(m_mtxGs2Ms);
m_queGs2MsPkts.push(Pkt);
}
#endif
}; void ThrTransData::ThreadLoop()
{
//SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
MapPkt Pkt;
try
{
int nCount = ;
while (true)
{
if(GetDataFromQueue(&Pkt))//从无锁队列中取包
{
ProcessPkt(Pkt);
m_memPool.pushPkt(Pkt.data, Pkt.len); nCount++;
if(nCount > )
{
nCount = ;
m_spTimerFactory->driveTimer();
}
continue;
}
{
m_spTimerFactory->driveTimer();
if (m_bStopWork)
break;
cxx11::this_thread::interruptible_wait();
}
}
}
catch(...)
{
char szMsg[] = {};
sprintf(szMsg, "【%s】线程%dMap :Pkt.cmd = %d",
__FUNCTION__, ::GetCurrentThreadId(), Pkt.cmd);
safe::error_msg(szMsg);
}
} void Map::ProcessPkt(MapPkt pkt)
{
//...
//gs2ms_add_player属于GS与MS通信的内部协议,内部协议采用树的形式,平行关系就太多了管理不方便
else if(gs2ms_add_player == pkt.cmd)//玩家进入地图消息,仅仅是个小例子
{
PlayerChannel* pPC = new PlayerChannel(this);//这个PlayerChannel是很大的一个模块,玩家信息,回头再看
//加到地图中,但是并未激活该玩家
int nChannelId = pPC->OnPlayerEnter(pkt.data, pkt.len);
m_vecPlayerChannel[nChannelId] = pPC;
AddPlayer(nChannelId);
}
//...
}

最新文章

  1. SQL Server:APPLY表运算符
  2. RapidJson读取json文档
  3. 【故障处理】一次RAC故障处理过程
  4. Linux-CentOS6.4-PXE-DHCP-FTP
  5. iphone6S“玫瑰金”的秘密——阳极氧化
  6. 【HDOJ】1009 FatMouse&#39; Trade
  7. MyEclipse汉化后问题
  8. 表空间tablespace,数据文件datafiles,和控制文件control files介绍
  9. MySQL学习记录(不断更新)
  10. MySQL索引设计需要考虑哪些因素?
  11. 前后端分离djangorestframework——解决跨域请求
  12. JAVA 11初体验
  13. 如何利用redis来进行分布式集群系统的限流设计
  14. 发现一种写法,类似callback&amp;&amp;callback()
  15. JVM调优常用参数和注意点备忘录
  16. office2007每次打开都要配置文件,怎么取消配置(可行)
  17. yii2常用路径获取
  18. Python *Mix_w3
  19. PHP会话(Session)实现用户登陆功能 转自#落人间#
  20. 自定义vueawesomeswiper分页器样式

热门文章

  1. vue element-ui Tabs 标签页实现【更多】功能
  2. [USACO15JAN]踩踏Stampede
  3. BZOJ—— 3402: [Usaco2009 Open]Hide and Seek 捉迷藏
  4. Algorithm | hash
  5. GRDB自定义的纯函数
  6. Java Hibernate事务并发控制
  7. (入门SpringBoot)SpringBoot结合定时任务task(十)
  8. OpenSSL使用1(用OpenSSL生成自签名证书在IIS上搭建Https站点)(用于iOS的https访问)
  9. osgcuda 【转】
  10. 远程桌面连接centos 7