关闭

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

2610人阅读 评论(4) 收藏 举报

先给个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.其他处理游戏逻辑的线程。


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

....

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:268436次
    • 积分:3445
    • 等级:
    • 排名:第9674名
    • 原创:80篇
    • 转载:18篇
    • 译文:0篇
    • 评论:76条
    最新评论