Closed gaowanlu closed 2 months ago
每个Player都是一个Entity 网关处有Player 游戏服也有Player 游戏服的每个Entity下会挂载许多协程 网关与游戏服之间用TCP IPC轮子通信 也可以有很多选择 UDP、KCP其实都不在话下
对于游戏服不断的会有从网关发来的包 有包则推给某个协程 然后对协程resume 然后协程内部自己消化 发送包到网关可能会发不出去的情况 这种直接拉链 能发生时再发 只用epoll监听一个IPC套接字就行了,围绕单线程事件循环 不断的触发协程 创建协程 销毁协程 而且游戏服可以与多个进程去IPC,单线程对于写业务代码很方便,每次只围绕一个消息进行处理
对于网关也有个Player(sockfd,conn,gid,roleid) 有一个线程单独进行与游戏服IPC worker会将收到的上行包推给IPC线程,让IPC线程发给游戏服 同时需要接收游戏服发来的包 游戏服发来的包直接向connection send可能失败,因为buffer会满 所以直接将包拉链到 网关的Player去,当可以发送时worker会process_conn 这时process_conn尝试从Player待发送队列中进行消息发送 还有一点就是怎么维护Player的队列的线程安全,加锁就导致IPC与worker水火不容了 所以可以直接向worker添加task,让conn对应的worker 将包拉链到对应Player或者直接send到conn 这样IPC线程几乎时完全非阻塞 保证了线程安全又不会出现激烈抢锁效率低下的情况
其他进程之间几乎只用进行IPC了,每个进程都是围绕事件循环 单线程 协程进行业务处理
demo in mind