有甚么框架实现卡片c 游戏服务器框架?

酷勤网 – 程序员的那点事!
当前位置: >
浏览次数:次
最近一段时间不是很忙,就写了一个自己的游戏服务器框架雏形,很多地方还不够完善,但是基本上也算是能够跑起来了。我先从上层结构说起,一直到实现细节吧,想起什么就写什么。
第一部分 服务器逻辑
服务器这边简单的分为三个部分,客户端的连接首先到达网关服务器,网关这里有个线程用来***来自与客户端的连接,然后在将这些数据发送到游戏逻辑服务器上,这个逻辑游戏服务器上,数据的交互就是通过与数据服务器进行交互。RecordServer专门用来处理与数据库的连接,查询这些事情。当然为了游戏服务器能够最大程度的不卡,肯定就得规定好网关服务器上的连接数量,免得像我们号称流畅的铁道部订票网络一样做个卡B,想想玩一局dota被卡的悲剧吧。当我们要做一个大型网游时,这三个服务器显然不够。当然在自己写的小游戏的时候就无所谓了,几个服务器全部架设在自己的破笔记本上,不就是启动几个程序而已。
这个感觉写得就差不多了,到细节吧。
第二部分 实现细节
这个就比较乱了,零零散散的,随便写了。这里很多都是对各种工具的封装,以便于自己 在项目的使用
项目这么多目录,这么多子目录,肯定得用工具去编译了,使用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 / fatel / info这些
11.时间封装
这个必须有,否则自己还每次去调用get_clocktime,gmtime,time各种函数呀。
12.使用boost库里的,Noncopyable,Singleton这些设计方法,来写我们的代码
13.定义好各种信号句柄,信号发生时采用什么策略,如SIGPIPE,做忽略处理
待续。。。。。。。。(睡觉了)
游戏服务器技术应该算来已经很成熟了,相比客户端,它的技术更新速度很慢了。客户端这边,技术很多,各种游戏引擎比如3D的虚幻这些,什么粒子引擎,声音这些,页游的flash, html5,utility,,太多了,搞不过来呀。我先把服务器这边好好专专,其他的等以后再说吧。
& 相关主题:
本文来源:您所在的位置: &
开源游戏服务器端框架Firefly正式将GFirefly整合!
开源游戏服务器端框架Firefly正式将GFirefly整合!
Firefly 的重要迭代版本 GFirefly 已经独立推出并运维了进9个月时间,已有200余家国内各大手机游戏厂商开始陆续使用GFirefly 进行其新手游产品的开发。(2014游戏行业国内最大黑马“龙图游戏”有3款自研产品均使用GFirefly)
Firefly 的重要迭代版本 GFirefly 已经独立推出并运维了进9个月时间,已有200余家国内各大手机游戏厂商开始陆续使用GFirefly 进行其新手游产品的开发。(2014游戏行业国内最大黑马&龙图游戏&有3款自研产品均使用GFirefly)
鉴于从0.1.2版本开始GFirefly已经基本稳定,本次Firefly官方正式宣布将GFirefly整合进Firefly官方git中。
GFirefly(全称:Firefly-Gevent)是Firefly的Gevent版本,相比之前Firefly版本中所使用的Twisted,Gevent更加的精简和高效。
GFirefly结合了Gevent的性能,封装了网络IO处理、数据库IO读写缓存、分布式进程间接口调用,这样使得游戏server端的开发变得既轻松简单又稳定高效。开发者不必在去纠结处理这些技术难题,专心致力于游戏玩法逻辑的开发即可。
与之前的Firefly相比,GFirefly省略了远程调用过程中添加回调函数callback的步骤。
你可以这样去写远程调用的方法:
result = root.callChild(&test_node&,1,u'Root测试')
#这里不会阻塞的,在结果返回之前会执行别的协程
print result
#当结果返回的时候会继续往下执行
此次更新的GFirefly alpha 0.1.5做了如下的改进:
1、& 单node节点断开与root节点的连接后自动重连。
2、& 修改了GFirefly的底层库GTiwsted(Firefly官方自研),将socket发送数据放到一个协程中进处理。在发送数据的时候,会将发送的数据放到一个队列中有发送数据的协程读取发送,解决了 AssertionError: This socket is already used by another greenlet 的错误。
Firefly官方维护团队:9秒社团
Firefly Git地址(内含gfirefly):/9miao/Firefly
Firefly OSC@GIT地址:http://git.oschina.net/9miao/firefly
GFirefly独立Git地址:/9miao/G-Firefly
GTwisted独立Git地址:/9miao/gtwisted【责任编辑: TEL:(010)】
关于&&&&&&的更多文章
现在开源已经不仅仅是精神,很多国内外的公司已经真正的践行起来
讲师: 85人学习过讲师: 66人学习过讲师: 39人学习过
谷歌于2005年收购了Android,而鲁宾帮助Android成为了
库克出柜了,为世界带来了别样的风景,虽说情理之中,
谷歌推出的Android操作系统,似乎与甜点结下了不解之
Java的出现,实现了跨操作系统平台的程序开发,以Java为基础的J2EE技术已经成为因特网服务技术的主流。然而,以J2EE为基础的SOA
Windows Phone专家
Android开发专家
51CTO旗下网站

参考资料

 

随机推荐