GS线程】的更多相关文章

void GameServer::ProcessThread() { try {//在ui线程里面搞个大try不是说try效率不好吗,难道只是为了出现错误发现在GS线程里面出现的吗 ProcessThreadTry(); } catch (...) { DWORD dwErrno = GetLastError(); MessageBox(NULL, L"GameServer::process_thread异常", L"异常", MB_OK); } } void Ga…
再看GS线程 void GameServer::ProcessThreadTry() { ; packet rcvPkt; rcvPkt.data = * ]; //该事件工厂主要创建了两个定时器1.livemgr的检测(即是否是有效的连接)2.道具帮会差异更新数据的获取即定时从道具帮会容器中获取差异需要保存到数据库的这个数据 //3.释放队列的处理,现在玩家下线不是直接把channel删除掉而是放到释放队列中等没有数据库访问时在删除,防止数据库回调出现野指针 I_TimerFactory* p…
GS界面上显示的重要参考数据,这个是压测时重要参考 struct GSinfo { int revBuffNum; int sendBuffNum; int clientNum; int dbAskNum; ///< 数据库请求包数 int dbHrNum; ///< 数据库结果包数 }; void __stdcall GameServer::get_info(GSinfo& rGsInfo) { rGsInfo.clientNum = m_LiveMgr.GetLinks();//这…
客户端发包,GS接收 bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的 { if(false == m_spDataLayer->Recv(rPkt)) return true;//没数据了 if(rPkt.is_data) { if(!rPkt.data)//数据为空 return false; GameChannel* pGC = m_vecChannel[rPkt.channel_id];//m_vecChannelGS里面所有玩家的…
开启GameServer模式 init函数,现在看看这个大函数干什么的 //这个init也是GameServerUI里面调的,这个线程其实就做了一些初始化的工作,其实这里面没有什么主不主线程,都是在一个进程里面的 void __stdcall GameServer::init() { ///设置最大连接数,现在还不知这个到底干啥的 Share::SetMaxGcNumb(); //指定本GS支持的最大数量 ///log日志,现在服务器写日志,在服务器报错的时候可以查看日志,还有报错时生成dump…
来看看map线程到底是如何运行的 很早就知道一个map是一个线程,以后有可能改成一个map一个进程,那就先来看看一个map一个线程是如何运作的 其实刚开始整个服务器就是两个线程,但发现这样服务器支持的人数不多,其实我是刚来具体不太清楚到底咋回事,也没有网络进程,最开始就是将GameMap从GameServer中分离出去,单独一个模块 经理说将GameServer相当于一个总闸的作用,相关的map相关的动作放到GameMap里面去做 NEW(Map); class Map : public Map…
//最近数据库存储做了重大改变,数据库内部的回头再说,先看看GS这边的 .现在感觉数据库的状态将请求包放入命令队列中,以前是全部放进去,这样让其他的数据库操作不会随着数据库定时器而变慢,GS线程去驱动,一分钟不太可能还存不完 .差异更新,GS只获取更改了的记录,这样不用每次都把全部的记录都放进去,这个过程是数据库改观不少 外面搞个mgr,内部使用可以重用的模板类,感觉是比之前封装的要好,但复杂度也上去了 m_spSaveOptMgr.reset(new SaveOptMgr(m_spAsynDB…
share到底干什么的 //--------------------打开GameServer,share中加载------------------------- .加载nBodyID //玩家的nBodyID表([职业][性别][nboduid]) std::vector<std::vector<int> > m_nbodyid_table; if(!load_nbodyid()) Plug::PlugMessageBox("加载nBodyID表失败啊!");…
有段时间没看map里面的东西了,刚才看发现功能上增加了一些,在来复习了一次流程初始化每个map建立线程,这个线程有两个功能,1.处理GS发过来的包 2.驱动map里面的定时器GS发过来的包是存在m_gs2msPkts2这个无锁的单消费者,单生产者队列中,只要是GS中不处理的包都要发到MAP中然后每个线程thrTransData::thread()就从m_gs2msPkts2中取包调用Map::process_pkt由于map继承了thrTransData,然后根据绑定调用对于的函数那如果map里…
asynDBCenter asynDBCenter是GS和DBCenter之间的模块,有了他GS访问数据库就是异步的了,以前是同步的,加入某个操作很耗时那么GS就在那等待这个返回值. .对于std::queue哪些情况要加锁,哪些不加 push.pop操作100%必须加锁,front和back操作是只读的,不会破坏状态,但是有读写顺序要求时还是要同步. 一般empty和size就不要锁了,对于锁 里面有两个容器 std::queue<CmdPkt> m_queueCmdPkt;//命令包容器…