帖子位于 "服务器" 分类 RSS

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

作者: apengjiang (1 篇文章) 日期: 三月 22, 2012 在 12:30 下午
评论 (51)

最近一段时间不是很忙,就写了一个自己的游戏服务器框架雏形,很多地方还不够完善,但是基本上也算是能够跑起来了。我先从上层结构说起,一直到实现细节吧,想起什么就写什么。 第一部分 服务器逻辑 服务器这边简单的分为三个部分,客户端的连接首先到达网关服务器,网关这里有个线程用来监听来自与客户端的连接,然后在将这些数据发送到游戏逻辑服务器上,这个逻辑游戏服务器上,数据的交互就是通过与数据服务器进行交互。RecordServer专门用来处理与数据库的连接,查询这些事情。当然为了游戏服务器能够最大程度的不卡,肯定就得规定好网关服务器上的连接数量,免得像我们号称流畅的铁道部订票网络一样做个卡B,想想玩一局dota被卡的悲剧吧。当我们要做一个大型网游时,这三个服务器显然不够。当然在自己写的小游戏的时候就无所谓了,几个服务器全部架设在自己的破笔记本上,不就是启动几个程序而已。 这个感觉写得就差不多了,到细节吧。 第二部分 实现细节 这个就比较乱了,零零散散的,随便写了。这里很多都是对各种工具的封装,以便于自己 在项目的使用 1.make 项目这么多目录,这么多子目录,肯定得用工具去编译了,使用aclocal,automake,autoconf,make,就把我们的程序编译好了,编写自己configure.in文件,定义编译选项、链接库等等一系列乱七八糟的东西,然后对每个需要编译的子项目编写Makefile.am,有的需要要编译成库的,比如base等基类这些,其他的都编译成可执行文件了,GatewayServer,LogicalServer,RecordServer。 2.套接字封装,epoll使用 linux里,我们使用socket来读写网络上的数据,这个很简单了,gateway上一个客户端连接过来,我们就为它分配一个socket 描述符了,在网关上,一个线程用来accept,一个线程用来做数据的处理,当accept一个连接请求后,放到数据处理的线程,接受到一个数据,然后直接转发到logical server上,我们使用epoll_wait,来处理套接上的读写处理。每n ms处理一次循环,每次循环中使用一次epoll_wait,一次把这些有事件的socket取出来。 3.数据加密解密,压缩解压 对网络上的数据,为了保证安全性,必须对它们进行加密解密处理,这个简单了,网上各种内容,这里就不说了(全部写完了,有时间再写)。对数据进行压缩,能减少带宽吞吐,就是简单的调用几个zlib函数的调用,不细说,在前面转发的《zlib使用》中有讲,发现自己太懒,实在是懒得打字了。 4.线程封装,互斥量,读写锁 这些都是简单的使用RAII或其他方式,对这些东西进行一次本地封装。(应该得写一个线程池去管理这些线程,todo) 5.数据库封装 使用mysql,使用mysql的C API函数,这个必须得封装一下,不是每次数据的处理,都得去做很多事情,实现一个本地的数据的Field(列),Record(记录),Table(表),DataBase(数据库),RecordSet(查询结果集)。制作一个数据库连接句柄MysqlHandle,处理对数据库的连接,处理等,实现一个HandlerPool,,每次从Pool中取出一个句柄来对数据库进行查询,免得每次都去重新连接,什么的。 6.自己的内存池 在之前分享的文章中《内存池技术详解》《编写自己的内存分配器》,自己的《内存池应用》,已经很详细的说明了,内存池的制作,当然我在这里还是有一些改动的,但是大概思路就是这些了。 7.有一个状态机的实现 这个也在自己之前写的那个状态机相关的文章里,也做记录了。哈哈,实在是不想继续码字了,但是还是坚持下去。 8.lua与c++交互框架 这个暂时写了一半,等全部完成了,再来弄,反正就是像npc处理这些,脚本处理这些,使用tolua++。 9.tinyxml封装,正则表达式封装 tinyxml一个轻量级的xml解析器,很简单,反正是把这些现成的东西拿来自己用。正则表达式没有进入c++标准,但是还是很多现成的正则表达式的处理,直接用linux库下的regex.h,就是编译正则表达式,匹配结果这些, 10.log系统 一个项目怎么能没有自己的日志系统呢,反正就是打日志,往文件里面写东西,用std::fstream轻松搞定,定义好日志级别:error / debug ...

继续 ›

分类: 博客征文专栏, 服务器, 游戏

MMORPG 游戏服务器端设计

作者: weiqubo (3 篇文章) 日期: 三月 22, 2012 在 12:30 下午
评论 (0)

  之前有过一篇介绍游戏服务器端的博文 http://blog.csdn.net/liuxialong/archive/2011/06/12/6539762.aspx 但是篇幅太长,而且过于关注细节,适合深读。 这里给出一种宏观把握MMORPG服务器设计的文章,适合入门,读完后对服务器端的设计能有大概的掌握,方便对感兴趣的部分进行深入了解。 1、首先是常见的服务器端结构,其中包括:登陆服务器、网关服务器、数据库服务器(账号数据库、角色数据库、地图数据库等)、聊天服务器、地图服务器、日志服务器等。下图为一个游戏大区的服务器群架构。所谓大区的意思,就是在打开客户端,进入游戏后,需要先选择大区,如:华南一区、华东电信等,进入大区后,再挑选服务器。下图的设计可以作为一个大区的架构使用。 2.登陆服务器 相应的工作流程为: 3. 网关服务器 工作流: 4. 地图服务器 工作流:

继续 ›

分类: 博客征文专栏, 服务器, 游戏

HTML5之Web Storage

作者: 章政 (3 篇文章) 日期: 十二月 26, 2011 在 12:00 下午
评论 (1)

WebStorage的出现是为了弥补cookie的不足,cookie一方面是容量小,4k/8k,存几个电子邮件都不够,二来是全局的,容易被误用,盗用。 在HTML5中网络存储按照生命周期分为2种,一种是基于会话(session),这种存储周期只是当前会话,当网页[注1]被关被后,或者被转到其他网站后,存储也就被销毁; sessionStorage.varName = “生成新变量”; sessionStorage.varName = “变量操作”; delete sessionStorage.varName; //删除变量 另外一种是本地存储,当网页下次被打开的时候,你仍然可以访问上次打开该网页时存储的数据,比如本地存储的网站用户名就可以使用这种方式。 用法和基于会话的存储一样,只是前缀名改成了localStorage localStorage.varName = “生成新变量”; localStorage.varName ...

继续 ›

分类: Android 开发, Blog Challenge, 全国博客大奖赛, 全国大学生软件创新大赛专栏, 其他, 博客征文专栏, 图形和视觉计算, 并行计算, 开放源代码, 服务器, 游戏, 移动技术, 英特尔® 软件网络 2.0, 英特尔信息技术峰会, 虚拟化技术, 软件开发工具, 软件技术学习及认证, 高校博客大奖赛

游戏服务器的架构设计

作者: smarttony (2 篇文章) 日期: 十二月 16, 2011 在 10:39 上午
评论 (0)

  游戏服务器的设计是一项颇有挑战性的工作,游戏服务器的发展也由以前的单服结构转变为多服机构,甚至出现了bigworld引擎的分布式解决方案,最近了解到Unreal的服务器解决方案atlas也是基于集群的方式。 负载均衡是一个很复杂的课题,这里暂不谈bigworld和atlas的这类服务器的设计,更多的是基于功能和场景划分服务器结构。 首先说一下思路,服务器划分基于以下原则: 1:分离游戏中占用系统资源(cpu,内存,IO等)较多的功能,独立成服务器 2:在同一服务器架构下的不同游戏,应尽可能的复用某些服务器(进程级别的复用) 3:以多线程并发的编程方式适应多核处理器。 4:宁可在服务器之间多复制数据,也要保持清晰的数据流向 5:主要按照场景划分进程,若需按功能划分,必须保持整个逻辑足够的简单,并满足以上1,2点 服务器结构图: 各个服务器的简要说明: Gateway:应用网关,主要用于保持和client的连接,该服务器需要2种IO,对client采用高并发连接,低吞吐量的网络模型,如IOCP等,对服务器采用高吞吐量连接,如阻塞或异步IO。 网关主要有以下用途: 1:分担了网络IO资源 2:同时,也分担了网络消息包的加解密,压缩解压等cpu密集的操作。 3:隔离了client和内部服务器组,对client来说,它只需要知道网关的相关信息即可(ip和port)。 4:client由于一直和网关保持常连接,所以切换场景服务器等操作对client来说是透明的。 5:维护玩家登录状态 World Server 是一个控制中心,它负责把各种计算资源分布到各个服务器 它具有以下职责: 1:管理和维护多个Scene Server 2:管理和维护多个功能服务器,主要是同步数据到功能服务器 3:复杂转发其他服务器和Gateway之间的数据 4:实现其他需要跨场景的功能,如组队,聊天,帮派等 Phys Server 主要用于玩家移动,碰撞等检测 所有玩家的移动类操作都在该服务器上做检查,所以该服务器本身具备所有地图的地形等相关信息。具体检查过程是这样的:首先,Worldserver收到一个移动信息,WorldServer收到后向Phys Server请求检查,Phys Server检查成功后再返回给world Server,然后world server传递给相应的Scene ...

继续 ›

分类: 博客征文专栏, 服务器, 游戏

高性能计算中并行的概念理解

作者: gengshenghong (2 篇文章) 日期: 十二月 2, 2011 在 5:14 下午
评论 (0)

  要理解并行编程,首先要从并行的理解开始。 (1)从Wiki中并行编程的解释说起 Wiki是个好东西,包含了很多专业术语的解释,关键的是,除了解释,wiki还是一个好文档。 Paralle Programming(并行编程/并行计算)Wiki:http://en.wikipedia.org/wiki/Parallel_programming Parallel computing is a form of computation in which ...

继续 ›

分类: 博客征文专栏, 并行计算, 服务器

客户端如何影响云计算的用户体验

作者: Bruce Chen 陈宇达 (Intel) (125 篇文章) 日期: 十一月 3, 2011 在 1:57 下午
评论 (0)

云计算已经成了热门词汇,更是IT投资的重点。那么客户端设备如何影响用户体验呢?这是一篇客户端如何影响云计算的用户体验的白皮书,供大家参考。 客户端如何影响云计算的用户体验

继续 ›

分类: 并行计算, 服务器

横向扩展数据中心存储

作者: Bruce Chen 陈宇达 (Intel) (125 篇文章) 日期: 十一月 3, 2011 在 1:51 下午
评论 (0)

数据中心的存储一直是多多益善,但总是经常发现不够用。如何经济高效的扩展呢?这是一篇横向扩展数据中心存储的白皮书。 横向扩展数据中心存储

继续 ›

分类: 并行计算, 服务器

提高数据中心的能效

作者: Bruce Chen 陈宇达 (Intel) (125 篇文章) 日期: 十一月 3, 2011 在 1:24 下午
评论 (1)

数据中心的重要开支就是能耗,如何降低能耗,更加绿色呢? 下面就是一篇通过对服务器功耗进行测量、评估,以提高数据中心的能效的白皮书。 提高数据中心的能效

继续 ›

分类: 并行计算, 服务器

云计算中心再落户重庆

作者: Bruce Chen 陈宇达 (Intel) (125 篇文章) 日期: 十月 24, 2011 在 2:51 下午
评论 (23)

云计算已经是全民皆知的热门概念了。不仅仅是软件厂商(ISV,SI)推出基于云计算的解决方案/软件产品,在各个重点城市的战略规划中,云计算也是不断涌现,在各地纷纷落户。 之前上海建了云计算中心,在近日推出的重庆“重庆市工业转型升级“十二五”规划”中,云计算也成了重点之一:重庆计划在十二五中,建成智能云端集群,同时使电子信息成为重庆的重要支柱产业。 据网上介绍,其智能云端集群是通过聚集移动运营商,金融客户,高端制造业客户,互联网客户等来做大数据处理业务。其中国内客户的在岸业务主要是商家对客户的B2C,而国外客户的离岸业务主要是商家对商家的B2B。 云计算中心就好比是信息的梧桐树,而其上的应用就是金凤凰了。看来国内除了公路机场的基建以外,信息化的基建也是热火朝天,云计算正当其时!

继续 ›

分类: 并行计算, 服务器

高性能接入 sever 开发优化

作者: kingsleer (1 篇文章) 日期: 九月 28, 2011 在 10:36 上午
评论 (2)

  从事高性能后台服务的开发2年,做大的支持是17w/s的访问100%cpu。这个数据是前几天在一个Server终极测试中得出的。其实后台服务器的反映快慢取决于其服务的类型。几个数据是这样的。 内存访问:300w/s.即us级别。访问一次300ns。 sock访问us级别。 磁盘访问ms级别。包括数据库。 如果只靠访问内存,你的Server应该处理30W/s的访问才能算达到要求。这个后续主要受限于fd的通知机制和高并发能力的epoll框架。当在网络层做到内核级优化,并且尽可能去掉内核中的锁,应该提高到40w/s甚至50w/s的访问。 高性能接入的关键是网络接入的性能和高效的通知机制。高性能对的网络处理必须的借个原则: 1.绝不能在网络处理部分加锁。 2.采用单进程的比共享的所效率提升3倍,加锁使网络吞吐能力大幅下降。 3.使用内存暂存数据,内存的管理必需预先分配好,寻找任一块的内存做到O(0).内存管理算法,这里大家去研究。我所处理的是分布式系统的高并发接入机,其中还涉及到后端的cache服务器的路由等。这个业务是server的逻辑,这个一块路由的设计也是有讲究的。要想最短的路由时间,必须设计可靠的内存访问和O(0)的路由查找算法。这一方面相信大家也应该懂了。 4.共享内存的访问跟内存访问一样。不过实际生产环境中往往需要对共享内存加锁。加锁使用信号量来实现。现在知道posix那一套多么牛X了。进程之间的通信,优选posix。经过测试表明,system V的接口比posix接口慢50%以上。显然现代的更先进。 5.去掉代码中的STL的链表,vector等操作,采用代替方案。对性能有非常大的提升,对减轻CPU消耗贡献巨大。良好的程序架构是减少bug的最好途径。代码需要反复检查。在分布式系统的访问都是多状态的。状态机的各部分处理是核心。需要对每一次请求做出最少的代价,需要很多脑筋可动的;包括代码的减少和函数的调用。很多系统调用代码,自己采用简单的方法实现。 6.减少时间函数的待用。缓存系统时间是一个非常好的优化,将时间用于整个处理的流程中几倍可以将cpu降低10个百分点。减少了系统空间和用户空间的调用。有兴趣可以看看内核代码。linux取的时间是不准确的,取时间需要加锁。进入内核空间,去读取cmos的时钟数据。每次更新系统时间都是原子性的操作。

继续 ›

分类: 博客征文专栏, 服务器