网络游戏前端服务器的需求和设计

网络游戏前端服务器的需求和设计

ID:8854962

大小:93.50 KB

页数:6页

时间:2018-04-09

网络游戏前端服务器的需求和设计_第1页
网络游戏前端服务器的需求和设计_第2页
网络游戏前端服务器的需求和设计_第3页
网络游戏前端服务器的需求和设计_第4页
网络游戏前端服务器的需求和设计_第5页
资源描述:

《网络游戏前端服务器的需求和设计》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、网络游戏前端服务器的需求和设计  首先介绍一下这个服务器的技术背景。在分布式网络游戏服务器中,前端连接服务器是一种很常见的设计。他的职责主要有:  1.为客户端和后端的游戏逻辑服务器提供一个软件路由——客户端一旦和前端服务器建立TCP连接以后就可以通过这个连接和后端的游戏服务器进行通讯,而不再需要和后端的服务器再建立新的连接。  2.承担来自客户端的IO压力——一组典型的网络游戏服务器需要服务少则几千多则上万(休闲游戏则可以多达几十万)的游戏客户端,这个IO处理的负载相当可观,由一组前端服务器承载这个IO负担可以有效的减轻后端服务器的IO负担,并且

2、让后端服务器也只需要关心游戏逻辑的实现,有效的实现IO和业务逻辑的解耦。  架构如图:   对于网络游戏来说,客户端与服务器之间需要进行频繁的通讯,但是每个数据包的尺寸基本都很小,典型的大小为几个字节到几十个字节不等,同时用户上行的数据量要比下行数据量小的多。不同的游戏类型对延迟的要求不太一样,FPS类的游戏希望延迟要小于50ms,MMO类型的100~400ms,一些休闲类的棋牌游戏1000ms左右的延迟也是可以接受的。因此,网络游戏的通讯是以优化延迟的同时又必须兼顾小包的合并以防止网络拥塞,哪个因素为主则需要根据具体的游戏类型来决定。  技术背景

3、就介绍这些,后面介绍的IOCP连接服务器就是以这些需求为设计目标的。 对IOCP服务器框架的考察  在动手实现这个连接服务器之前,我首先考察了一些现有的开源IOCP服务器框架库,老牌的如ACE,整个库太多庞大臃肿,代码也显老态,无好感。boost.asio据说是个不错的网络框架也支持IOCP,我编译运行了一下他的例子,然后尝试着阅读了一下asio的代码,感觉非常恐怖,完全弄不清楚内部是怎么实现的,于是放弃。asio秉承了boost一贯的变态作风,将C++的语言技巧凌驾于设计和代码可读性之上,这是我非常反对的。其他一些不入流的IOCP框架也看了一些,

4、真是写的五花八门什么样的实现都有,总体感觉下来IOCP确实不太容易把握和抽象,所以才导致五花八门的实现。最后,还是决定自己重新造轮子。 服务框架的抽象  任何的服务器框架从本质上说都是封装一个事件(Event)消息循环。而应用层只要向框架注册事件处理函数,响应事件并进行处理就可以了。一般的同步IO处理框架是先收到IO事件然后再进行IO操作,这类的事件处理框架我们称之为Reactor。而IOCP的特殊之处在于用户是先发起IO操作,然后接收IO完成的事件,次序和Reactor是相反的,这类的事件处理框架我们称之为Proactor。从词根Re和Pro上,

5、我们也可以容易的理解这两者的差别。除了网络IO事件之外,服务器应该还可以响应Timer事件及用户自定义事件。框架做的事情就是把这些事件统统放到一个消息队列里,然后从队列中取出事件,调用相应的事件处理函数,如此循环往复。  IOCP为我们提供了一个系统级的消息队列(称之为完成队列),事件循环就是围绕着这个完成队列展开的。在发起IO操作后系统会进行异步处理(如果能立刻处理的话也会直接处理掉),当操作完成后自动向这个队列投递一条消息,不管是直接处理还是异步处理,最后总会投递完成消息。  顺便提一下:这里存在一个性能优化的机会:当IO操作能够立刻完成的话,

6、如果让系统不要再投递完成消息,那么就可以减少一次系统调用(这至少可以节省几个微秒的开销),做法是调用SetFileCompletionNotificationModes(handle,FILE_SKIP_COMPLETION_PORT_ON_SUCCESS),具体的可以查阅MSDN。  对于用户自定义事件可以使用Post来投递。对于Timer事件,我的做法则是实现一个TimerHeap的数据结构,然后在消息循环中定期检查这个TimerHeap,对超时的Timer事件进行调度。  IOCP完成队列返回的消息是一个OVERLAPPED结构体和一个ULO

7、NG_PTRcomplete_key。complete_key是在用户将Sockethandle关联到IOCP的时候绑定的,其实用性不是很大,而OVERLAPPED结构体则是在用户发起IO操作的时候设置的,并且OVERLAPPED结构可以由用户通过继承的方式来扩展,因此如何用好OVERLAPPED结构在螺丝壳里做道场,就成了封装好IOCP的关键。  这里,我使用了一个C++模板技巧来扩展OVERLAPPED结构,先看代码:struct IOCPHandler{    virtual void Complete(ULONG_PTR key, DWOR

8、D size) = 0;    virtual void OnError(ULONG_PTR key, DWORD err

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。