服务器公共组件实现 -- mangos的游戏主循环

原创 2007年09月18日 00:05:00

  当阅读一项工程的源码时,我们大概会选择从main函数开始,而当开始一项新的工程时,第一个写下的函数大多也是main。那我们就先来看看,游戏服务器代码实现中,main函数都做了些什么。

  由于我在读技术文章时最不喜看到的就是大段大段的代码,特别是那些直接Ctrl+C再Ctrl+V后未做任何修改的代码,用句时髦的话说,一点技术含量都没有!所以在我们今后所要讨论的内容中,尽量会避免出现直接的代码,在有些地方确实需要代码来表述时,也将会选择使用伪码。

  先从mangos的登录服代码开始。mangos的登录服是一个单线程的结构,虽然在数据库连接中可以开启一个独立的线程,但这个线程也只是对无返回结果的执行类SQL做缓冲,而对需要有返回结果的查询类SQL还是在主逻辑线程中阻塞调用的。

  登录服中唯一的这一个线程,也就是主循环线程对监听的socket做select操作,为每个连接进来的客户端读取其上的数据并立即进行处理,直到服务器收到SIGABRT或SIGBREAK信号时结束。

  所以,mangos登录服主循环的逻辑,也包括后面游戏服的逻辑,主循环其实是在SocketHandler中,也就是那个Select函数中,检查所有的连接,对新到来的连接调用OnAccept方法,有数据到来的连接则调用OnRead方法,然后socket处理器自己定义对接收到的数据如何处理。

  很简单的结构,也比较容易理解。

  只是,在对性能要求比较高的服务器上,select一般不会是最好的选择。如果我们使用windows平台,那IOCP将是首选;如果是linux,epool将是不二选择。我们也不打算讨论基于IOCP或是基于epool的服务器实现,如果仅仅只是要实现服务器功能,很简单的几个API调用即可,而且网上已有很多好的教程;如果是要做一个成熟的网络服务器产品,不是我几篇简单的技术介绍文章所能达到。

  另外,在服务器实现上,网络IO与逻辑处理一般会放在不同的线程中,以免耗时较长的IO过程阻塞住了需要立即反应的游戏逻辑。

  数据库的处理也类似,会使用异步的方式,也是避免耗时的查询过程将游戏服务器主循环阻塞住。想象一下,因某个玩家上线而发起的一次数据库查询操作导致服务器内所有在线玩家都卡住不动将是多么恐怖的一件事!

  另外还有一些如事件、脚本、消息队列、状态机、日志和异常处理等公共组件,我们也会在接下来的时间里进行探讨。 

服务器公共组件实现 -- mangos的游戏主循环

  当阅读一项工程的源码时,我们大概会选择从main函数开始,而当开始一项新的工程时,第一个写下的函数大多也是main。那我们就先来看看,游戏服务器代码实现中,main函数都做了些什么。  由于我在读...
  • lfhfut
  • lfhfut
  • 2007年09月18日 00:05
  • 4593

游戏服务器编程

拼包函数及网络封包的异常处理(含代码) 本文作者:sodme 本文出处:http://blog.csdn.net/sodme 声明:本文可以不经作者同意任意转载、复制、传播,但任何对本文的引...
  • yaoxiaokui
  • yaoxiaokui
  • 2015年10月25日 20:26
  • 2810

Mangos源码分析(7):服务器公共组件实现之游戏主循环

当阅读一项工程的源码时,我们大概会选择从main函数开始,而当开始一项新的工程时,第一个写下的函数大多也是main。那我们就先来看看,游戏服务器代码实现中,main函数都做了些什么。  由于我在读技术...
  • u011686361
  • u011686361
  • 2015年09月10日 12:03
  • 967

Mangos服务器框架设计分析(一)

距离上次写博客已经大半年了,这大半年中经历了很多的人和事,并且也收获了很多,所在的项目组游戏已经成功上线运营了,在此稍微花点时间记录一下这大半年在业余时间做的一些技术积累吧,在此就以堪称是“大魔兽私服...
  • zmyer
  • zmyer
  • 2015年01月22日 20:41
  • 1145

游戏服务器帧率控制

   网络游戏服务器的主要作用是模拟整个游戏世界,客户端用过网络连接把一些信息数据发给服务器,在操作合法的情况下,更新服务器上该客户端对应的player实体、所在场景等,并把这些操作及其影响广播...
  • qq51931373
  • qq51931373
  • 2014年04月21日 22:00
  • 2046

Go游戏服务器开发的一些思考(十一):IO游戏同步

概要说到IO游戏,自然要提到如何同步。好的同步是IO游戏成功的基石。同步分为2类:帧同步和状态同步。本文主要考察状态同步。好的同步如图,第N次主循环后,服务器会把状态发给客户端。客户端在服务器N+1次...
  • u013272009
  • u013272009
  • 2017年08月05日 10:38
  • 940

mangos服务器架构

来自:百度文库 原文:http://wenku.baidu.com/view/9d98758c84868762caaed5e3.html   登录服的设计 -- 功能需求 正如我们在前面曾讨论过的,登...
  • kenkao
  • kenkao
  • 2013年10月08日 16:39
  • 2952

Mangos源码分析(9):服务器公共组件实现之环形缓冲区

消息队列锁调用太频繁的问题算是解决了,另一个让人有些苦恼的大概是这太多的内存分配和释放操作了。频繁的内存分配不但增加了系统开销,更使得内存碎片不断增多,非常不利于我们的服务器长期稳定运行。也许我们可以...
  • u011686361
  • u011686361
  • 2015年09月10日 15:19
  • 326

[服务器] 网游服务端开发入门知识

原文链接:http://www.cnblogs.com/GameDeveloper/archive/2011/05/24/2055880.html 【广播现在还是服务器控制,没有客户端参与配合。   ...
  • bearcoding
  • bearcoding
  • 2016年07月01日 04:17
  • 1687

百万用户级游戏服务器架构设计(二)

登录服的设计 -- 功能需求   正如我们在前面曾讨论过的,登录服要实现的功能相当简单,就是帐号验证。为了便于描述,我们暂不引入那些讨论过的优化手段,先以最简单的方式实现,另外也将基...
  • AnonymousRookie
  • AnonymousRookie
  • 2016年05月07日 22:26
  • 1702
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:服务器公共组件实现 -- mangos的游戏主循环
举报原因:
原因补充:

(最多只允许输入30个字)