随笔分类 - 项目分析
摘要:现在就来看看共享内存的初始化(过程是非常复杂的,也看了好多次)1.内存池(其实这个也是放到共享内存里面)ProcessMemPoolEx m_ProcessMemPool;{ 其中包括小,中,大三种模式,就以小举个例子 1.是否初始化m_镜像,表示2是否初始化, 2.托管内存队列:...
阅读全文
摘要:上次说到对于那种有内容的包bool TCPServer::on_receive_data(int channel_id, void* data, int len){ packet pkt; { pkt.data = m_memPool.popPkt(len);//从内存池分...
阅读全文
摘要://一个发包的流程第一个包就是客户端的心跳包,现在加了版本的包再来看看这个发包打包过程,过程坚持,但理解费劲void NGP::OnliveTimer()//客户端心跳,5s发一次{ SendCmd(c2s_on_live, NULL, 0);}bool NGP::SendCmd(int nC...
阅读全文
摘要:一个客户端连接网络模块工作(一个连接的过程)监听线程收到一个连接后像轮询线程的连接队列中push一个conn_queue_item,然后向soketpair中写入一个字节此时子线程就是自动调用设置的事件,然后从连接队列中pop一个socket然后创建一个机遇socket的bufferevent在cr...
阅读全文
摘要:GS进程首先创建共享内存,然后创建子进程首先也是初始化共享内存,就是从刚才的GS的创建的共享内存读出地址,然后就是libevent创建libevnet线程和监听线程此时net进程会创建一个线程 std::thread thrPush([this]() { for (;;) ...
阅读全文
摘要:BUFF,DEBUFF:增益状态,包括自己或者队友施加的,例如骑士的祝福,牧师的耐力精神,小德的爪子DEBUFF就是减益状态,例如你PK的时候法师的寒冰箭减速,盗贼的毒药,SS的腐蚀等等NPC:NPC就是Non-Player-Controlled Character 即“非人控制玩家角色”,我们游戏...
阅读全文
摘要:网络模块(1)一.服务端:暂时就以libevent模块,共享内存等下1.GS打开,首先创建4个libevent子线程,当然为每个线程设置连接通知回调函数,这个是基于sockpair的,然后再创建一个监听线程,专门负责监听2.监听线程收到一个连接后,通过轮询选择一个线程,然后向这个线程的conn_qu...
阅读全文
摘要:客户端打开服务器是怎么知道连接的1.客户端调用NGP的接口TcpLinkEx::TcpLinkEx(){ auto ser = GetPlug(LibEvtServer); if(!ser) { ser = NEW(LibEvtServer); SetP...
阅读全文
摘要:服务器共享内存以及客户端打开服务器获得通知过程打开GS就会进行共享内存的初始化,过程很复杂,看了很多次,今天看的时候终于了解了大概了bool DataLayer::init(){ int pid = GetCurrentProcessId(); auto path = Plug::Get...
阅读全文
摘要:asynDBCenter加入数据库心跳,其实是没有找到更好的方法,看看和以前有什么不同mongo数据库重练,暂时没有找到好办法,只能这样定时访问bool asynDBCenter::init(bool isInitRobot){ if(isInitRobot) m_dbcente...
阅读全文
摘要:asynDBCenterasynDBCenter是GS和DBCenter之间的模块,有了他GS访问数据库就是异步的了,以前是同步的,加入某个操作很耗时那么GS就在那等待这个返回值。1.对于std::queue哪些情况要加锁,哪些不加push、pop操作100%必须加锁,front和back操作是只读...
阅读全文
摘要:现在的状态:书读的少,没有思想,社会阅历少,抗击打能力差,性子太急,太不成熟希望成熟一点,这些都是成功的大忌,否则你得不到机会,或者机会在眼前你不知道,不知什么东西是好的,更不知如何做人,许多东西都决定了我以后能走多远
阅读全文
摘要:这个协议不知我在上面耗费了多长时间,也有人问过我咋回事,这个protocol不长,但对于我来说理解起来很费劲,今天回来看看忽然看懂了(80%),只能说不知看了多少遍其实这些东西应该在来的一个月这样子都要会的,一直拖到现在,其实那时时真心看不懂#ifndef Protocol_Base_H#defin...
阅读全文
摘要:我刚才在想两个线程同时访问一个函数有没有问题看到这个我就放心了其实你可以这样想,函数本身只是代码,代码是只读的,无论多少个线程同时调都无所谓(因为只读嘛)。但是函数里面总要用到数据,如果数据属于线程(比如函数参数、局部变量,存在栈上,每个线程都有自己的栈),那么同时调还是没关系,因为用的本线程的数据...
阅读全文
摘要:多线程版Libevent//保存线程的结构体struct LibeventThread{ LibEvtServer* that; //用作传参 std::shared_ptr spThread; // 线程 struc...
阅读全文
摘要:几个问题:1.libevent到底用的是select还是iocp,然后是如何突破64限制的typedef struct fd_set { u_int fd_count; /* how many are SET? */ SOCKET fd_...
阅读全文
摘要:单线程libevent模式项目里面是多线程版的,我先理解下单线程的。//client1.调用NGP::init()bool NGP::init(NGPcontext context){ _context = context; //_TcpLink = NEWSP(TcpLink); ...
阅读全文
摘要:curpostgtpos乍一看以为是当前位置和目标位置,但在项目里面这两个位置有点坑当客户端玩家移动或者AI里面的位置,会把获得的位置付给tgtpos而以前的tgtpos会付给curpos所以这个tgtpos是当前玩家或者怪物站立的位置,而curpos是上一个位置我想要这个curpos有什么用呢这个...
阅读全文
摘要:玩家移动1.检查位置包auto& mpos = m_spBase->getMapPos(pos.tgtPos);if(!check_move_pos(pos, pl)) return;2.跟新当前位置及方向,更新客户端发过来的位置pl->last_move_mode = EnumMoveMod...
阅读全文
摘要:MoveManager:移动管理类struct MoveOpt{ int cur_seq; ObjecInfo* obj;};std::map m_move_objs;//主要容器//加入移动标记void MoveManager::add_mask(ObjecInfo* obj){ ...
阅读全文

浙公网安备 33010602011771号