阅读天龙八部的代码有感----两种逻辑处理模式的比较

news/2024/7/9 17:23:33 标签: epoll, 数据结构与算法

1: 天龙八部的逻辑处理模块:

  逻辑处理模块:

  void run

  {

   for(;;){

       select();  //epoll wait();

       process_inputs();

       process_commands();

       process_outputs();

       process_execeptions();

      }

  }

  天龙八部的SocketOutputStream 和 SocketInputStream 类设计最大程度的减少了内存拷贝,加上Packet/PacketFactory工厂模式的设计,在很多程度上面提升了单线程处理能力,无论是GameServer BIllingServer LoginServer 都几乎没有加锁的操作,这样也就最大程度上消除了线程调度的性能消耗;如果我们把这个模式引入到页游,那么就可以这样设计:我们将天龙八部的select 模型换成现在流行的epoll模型。

                          图1: 服务器的分布

    无论验证服,聊天服,还是场景服都做类似的处理模式。场景内还需要添加日志线程、流水线程,专门用于处理日志的打印和流水的迁移。

    这个模式的优点:

         1: 每个角色对应一个连接,能够方便的处理消息,减少附加数据结构的设计

         2: 内存拷贝少

         3: 单个进程内所有的玩家都在同一个进程,玩家之前的交互逻辑很容易处理

   这个模式的缺点:

         1:不能充分利用现在多核的设计

2: 另一种处理模式:

                            图 2      另一种设计

通信线程:

 void run()

{

  for(;;){

      select(); //select  epoll wait();

      process_input();

      process_output();

      process_disconnect();

  }

}

逻辑处理逻辑:

void run()

{

    while(TRUE)

   {

          Packet* packet = NULL;

          PacketList.pop(packet);

          if(packet != NULL)

          {

                  process_packet(packet);

           }

   }

}

这里的通信模块更像是一个网关,通信模块和逻辑处理模块之间是经典的生产者和消费者模式,无论是采用巧夺天工的Kfifo设计还是使用自旋锁设计都可以,只是要尽量解除线程切换和等待。

这个模式的优点

             1: 能配置成多线程处理,比如 n:m

     缺点:

             1: 内存拷贝多

             2: 数据迁移之后,需要map去映射玩家和连接

 

感想:

     页游服务器相对来说是端游服务器的弱化版,当然我们也可以设计一个网关服去加大服务器承载的玩家数量,但是这样经过不同进程之间转发的消息又必然会带来很多同步问题,比如帮派和组队逻辑要坐在世界服,而走动打斗逻辑要做在场景服,在玩家在场景之间切换的时候或者一些帮派、好友数据需频繁同步。上面的两种模式不过是工作之余的思考,和参考其他的网友的分享想到的,还有很多的数据没有经过测试,比如在内存拷贝、线程同步与多线程之间如何取舍。还是很想听听其他网友的意见。


http://www.niftyadmin.cn/n/1109889.html

相关文章

MySQL购InnoDB不敌甲骨文宣布开放数据引擎(转)

MySQL购InnoDB不敌甲骨文宣布开放数据引擎(转)[more]2006年04月28日 08:32 eNet硅谷动力 【eNet硅谷动力消息】据国外媒体报道,在甲骨文收购MySQL使用的数据引擎之一的Innobase之后,MySQL下一步怎么走曾引起业界关注。本周三,MySQL终于作出一…

web.xml的配置中context-param配置作用

<context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>2.紧接着,容器创建一个Servl…

开始博客之旅

博客现在已经不详当初那么火爆了&#xff0c;但是为了记录自己的学习&#xff0c;分享知识&#xff0c;AND听取大家的批评建议&#xff0c;来到51CTO建立自己的第一个博客。希望大家多多支持&#xff01;转载于:https://blog.51cto.com/googol/1766026

Linux你不出手等什么(转)

Linux你不出手等什么(转)[more]【来源&#xff1a;eNet硅谷动力】 【作者&#xff1a;贾敬华】 【eNet硅谷动力特稿】打击盗版&#xff0c;微软2006年的动作似乎胸有成竹。不久&#xff0c;国家四部委强制下文&#xff0c;禁止未预装正版操作系统的PC上市。随后&#xff0c;国内…

使用 webpack 4 配置 Vue.js 项目

一、Webpack 4 的基本安装 执行控制台命令的两个方法&#xff1a; 方法一&#xff1a;在 Windows资源管理器中创建并进入文件夹后&#xff0c;按键盘 Shift 鼠标右键&#xff0c;选择“在此处打开 PowerShell 窗口”&#xff08;Win 10&#xff09;或 “在此处打开命令窗口”…

福布斯:Sun下场本可避免 老CEO不听劝(转)

福布斯&#xff1a;Sun下场本可避免 老CEO不听劝(转)[more]2006年04月27日 10:41 赛迪网 作者:友亚 【赛迪网讯】4月27日消息&#xff0c;据外电报道&#xff0c;Sun之所以发展到今天这样的不利局面&#xff0c;主要是因为受到了免费Linux的冲击。但事实上&#xff0c;今天的这…

【MongoDB for Java】Java操作MongoDB

开发环境&#xff1a; System&#xff1a;Windows IDE&#xff1a;eclipse、MyEclipse 8 Database&#xff1a;mongoDB 开发依赖库&#xff1a; JavaEE5、mongo-2.5.3.jar、junit-4.8.2.jar 一、准备工作 1、 首先&#xff0c;下载mongoDB对Java支持的驱动包 驱动包下载地址&am…

Uvalive 4043 Ants —— 二分图最大权匹配 KM算法

题目链接&#xff1a;https://vjudge.net/problem/UVALive-4043 题意&#xff1a; 给出n个白点和n个黑点的坐标&#xff0c; 要求用n条不相交的线段把他们连接起来&#xff0c;其中每条线段恰好连接一个白点和黑点&#xff0c;每个点恰好连接到一条线段。输出每个白点与其相连的…