多线程游戏服务器开发(1)-简介

时间:2022-09-08 23:26:24

准备工作

随着C++11的普及,利用asio网络库可以更加轻松地编写跨平台的C++服务器。我的目标就是编写出一个轻量的多线程服务器框架。

准备

  • visual studio 2015 社区版 这个版本对C++11支持比较全面
  • asio 这是从boost库剥离出来的跨平台网络库,使用支持C++11的编译器可以完全不再依赖boost库
  • google protobuf 支持多种语言的数据序列化库

框架介绍

多线程游戏服务器开发(1)-简介

  • actor_manger
    模块管理器,可以代表一个独立的进程,或者单独的机器。用一个8位整型的machine id标识,也就是说最多可以有255 个模块管理器(可以是相同机器的不同进程, 也可以是不同的机器)。
    1.负责模块的创建与销毁

    2.负责模块的线程资源分配,一旦把模块分配到工作线程,将不能在改变。
    3.模块间消息通信桥梁。

  • worker
    工作者线程,负责驱动这个worker中的所有模块处理消息。用一个8位整型的worker id标识,一个actor_manger中可以有255个worker线程。worker 消息循环: 遍历其中的模块,把消息队列长度大于0的模块,保存到一个队列 ActorQueue 中。然后遍历ActorQueue,每次取出一个模块 Module ,并处理Module的消息队列队首的一条消息,如果Module的消息队列长度依然大于0, 则把Module 插入 ActorQueue 的队尾, 直到所有模块的消息队列长度为0。

  • actor
    模块的基类,每个模块都有一个独立的消息队列。同一个模块中的所有操作都是线程安全的,不同模块间通信可以通过发送message。(游戏中可以有 登录模块,数据库模块,世界模块,场景模块等等)
    。broker 继承actor, 实现了一个带网络通信的模块

初步实现

https://github.com/sniper00/moon_net 这是一个初步实现的代码,以后将围绕这些代码进行介绍。