浅谈游戏服务器架构(待续)

原创 2012年03月26日 00:15:23

先给个URL,这是我最近看的几篇游戏服务器架构文章里写得比较好的一个,http://www.doc88.com/p-57286039026.html


关于游戏服务器架构,鸟人准备写一点自己的认识

目前鸟人还没自己设计过一款服务器架构,所以下面写的仅仅是自己在工作和学习中对服务器架构的一些理解和设想,不足之处通过以后的积累慢慢改善

这里说的主要是C/S结构的服务器架构,可以是客户端游戏也可以是网页游戏(flash客户端),跟那种基于http server用php等脚本制作的网页游戏(鸟人暂时没接触过这种游戏开发)没什么关系


1.先说说网络io模型和网络框架

windows下iocp和linux下epoll毫无疑问是目前为止在相应平台效率最高的网络io模型(可以看看这篇文章关于各种网络io模型的分析,http://blog.csdn.net/xiarendeniao/article/details/7267068

那么我们是否需要自己动手写一个网络框架呢,答案是否定的,我们是做游戏不是做义工,精力要花在刀刃上,有现成的网络框架我们为什么不用呢

据我所知,在这方面我们有下面这些选择:wow mangos,wow ascent,ACE,asio,libevent(这些貌似都是跨平台的网络框架)

我在前两年的工作中接触的是wow ascent这个框架,之前在code project上可以找到,现在不见了,但是网上还是可以找到ascent的各种变体


2.再说说线程池吧

个人觉得线程池存在的必要性在于:省掉在需要时当场创建线程的时间防止服务器被卡住、线程创建销毁等操作交给一个成熟的线程池完成可以让我们省掉很多工作并避免很多出错的机会(正所谓,把自己不擅长的事交给专业人士去做吧)、逻辑和线程分离让服务器逻辑更清晰(把各个逻辑线程体扔给线程池让它找个线程跑就行了,跑完后线程会被线程池挂起来等待下一个线程体的到来)

wow ascent里面有一个很好的线程池,其他成熟的线程池有哪些我没特意去找,我这里只是想说明一下线程池存在的意义而已


3.数据库接口

一个封装好便于游戏逻辑调用的数据库接口当然是必不可少的,提供同步和异步(需要额外线程)两种查询方式也是应该的


4.跨平台支持

游戏服务器上线后一般都在linux环境下运行,那么是不是可以完全抛弃windows平台呢?最好不要,在vim等IDE下开发速度跟VS开发速度相媲美的程序员还是比较少的,把gdb用得再怎么出神入化查看stl容器中的元素也还是比较费劲的(相对于VS调试)

那么,前述的几个底层库最好能支持跨平台并提供统一的对上层的接口

跨平台开发需要注意哪些问题?

C++本身是平台无关的,仅仅使用C++标准库里面的函数和数据结构是不存在跨平台不兼容的

在所有需要系统调用的地方应该针对不同平台使用不同的系统api并加上条件编译,然后封装成一致的接口。主要是线程使用、锁使用、socket调用、网络模型、32位64位等问题...


好了,现在我们来做一个独立服务器试试

1.socket监听线程

2.读取数据的网络工作线程。读取,不是处理,数据的处理需要扔给其他线程,防止网络线程阻塞导致客户端卡住:如果是登陆消息就扔给登陆线程,如果是心跳包可以即时回应,如果是其他游戏数据则放入跟socket绑定的数据结构(比如,跟socket绑定的session的一个数据队列queue)中等待其他线程处理。在拜读ascent网络框架这部分代码的过程中发现它给每个socket准备了一个环形缓冲区,网络io往前写,工作线程在后面追着读,使内存可以反复使用。

   windows下根据cpu个数创建对应数量的网络工作线程,每个线程通过GetQueuedCompletionStatus一次拿一个有事件的socket,读取网络数据并做上述处理

   linux下启动一个网络工作线程,该线程调用epoll_wait拿到所有有事件的socket,读取网络数据并做上述处理

3.登陆验证的线程。可以根据cpu数量来启动对应个数的线程,因为登录是非常频繁的操作,尤其是刚开服的瞬间。

   按照协议格式解析数据,并跟数据库中的user:passwd做验证,通过则为socket创建session,不通过就断掉连接。

4.处理客户端游戏数据的线程

    这里需要根据业务逻辑来把session划分到不同的线程中(大用户量上来的时候如果放在同一个线程处理肯定是会卡死的),比如,如果是国战类的游戏可以一个国家启动一个线程来处理该国家的所有玩家发来的数据。客户端数据的校验在这里完成。在处理过程中可以根据业务逻辑把数据投递到其他线程,比如地图线程。

5.地图线程。我做过的是整个游戏一张大地图的策略类游戏,可能是因为熟悉所以觉得简单吧。至于需要多张地图副本的角色扮演游戏需要根据具体游戏逻辑设计。

6.其他处理游戏逻辑的线程。


那么做一个服务器组怎么样呢?

....

经典游戏服务器端架构概述 (1)

作者介绍:韩伟,1999年大学实习期加入初创期的网易,成为第30号员工,8年间从程序员开始,历任项目经理、产品总监。2007年后创业4年,开发过视频直播社区,及多款页游产品。2011年后就职于腾讯游戏...
  • tengxy_cloud
  • tengxy_cloud
  • 2016年12月12日 09:58
  • 2127

经典游戏服务器端架构概述 (2)

全服分线模型 一. 模型描述 由于多进程服务器模型的发展,游戏开发者们首先发现,由于游戏业务的特点,那些需要持久化的数据,一般都是玩家的存档,以及一些游戏本身需要用的,在运行期只读的数据。...
  • tengxy_cloud
  • tengxy_cloud
  • 2016年12月12日 10:01
  • 2453

大型多人在线游戏服务器架构设计

由于大型多人在线游戏服务器理论上需要支持无限多的玩家,所以对服务器端是一个非常大的考验。服务器必须是安全的,可维护性高的,可伸缩性高的,可负载均衡的,支持高并发请求的。面对这些需求,我们在设计服务器的...
  • wgslucky
  • wgslucky
  • 2016年09月24日 20:37
  • 8772

游戏服务端架构发展史(上)

手游页游和端游,本质上没有区别,区别的是游戏类型: 《游戏服务端架构发展史》转载请著名出处:http://www.skywind.me/blog/archives/1265  类型1:卡牌,跑酷等...
  • suxinpingtao51
  • suxinpingtao51
  • 2015年07月29日 12:36
  • 1698

游戏服务器架构发展史

手游页游和端游,本质上没有区别,区别的是游戏类型:   类型1:卡牌,跑酷等弱交互服务端   卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道...
  • u010852160
  • u010852160
  • 2016年07月15日 13:40
  • 1778

一种高性能网络游戏服务器架构设计

网络游戏的结构分为客户端与服务器端,客户端采用2D绘制引擎或者3D绘制引擎绘制游戏世界的实时画面,服务器端则负责响应所有客户端的连接请求和游戏逻辑处理,并控制所有客户端的游戏画面绘制。客户端与服务器通...
  • yh1548503342
  • yh1548503342
  • 2014年12月05日 17:34
  • 9586

棋牌游戏服务器架构: 总体设计

首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构。网狐棋牌最令人印象深刻的是其稳定性和高网络负载。它的一份压力测试报告上指出:一台双核r的INTEL Xeon 2.8CPU加上2G内存和...
  • liujiayu2
  • liujiayu2
  • 2016年02月05日 14:01
  • 1515

一个简单的游戏服务器框架

http://www.cppblog.com/luqingfei/archive/2012/05/29/176587.html http://software.intel.com/zh-cn...
  • oMingZi12345678
  • oMingZi12345678
  • 2014年11月07日 03:52
  • 1549

从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则

http://blog.itpub.net/17007506/viewspace-616852/  腾讯QQGame游戏同时在线的玩家数量极其庞大,为了方便组织玩家组队游戏,腾讯设置了大量游戏室(房...
  • yaoxiaokui
  • yaoxiaokui
  • 2015年11月01日 09:38
  • 1796

Netty构建游戏服务器(一)--基本概念与原理

一,Netty是什么 1,Netty是由JBOSS提供的一个java开源框架。 2,Netty是JAR包,一般使用ALL-IN-ONE的JAR包就可以开发了。 3,Netty不需要运行在Tomc...
  • u012486840
  • u012486840
  • 2016年10月26日 20:07
  • 4472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈游戏服务器架构(待续)
举报原因:
原因补充:

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