⾃2000年Python第⼀个稳定的2.7版本发布以来,Python"简单、明确、优雅"设计哲学的根本出发点就决定了Python这⻔语⾔的编程易⽤性和⼯作⾼效性。特别是近几年来,在游戏⾏业中传统的编程语⾔c++开发及维护成本极⾼的劣势逐渐凸显,同样的业务需求实现,可能传统编程语⾔c++程序猿需要1周,⽽⼀个普通的Python程序猿可能三天就能完成,同时后续隐藏的bug还会少很多。于是在休闲、棋牌游戏领域,Python这⻔⾼效的脚本语⾔开始逐渐流⾏起来。
作为棋牌游戏中复杂度最⾼的游戏,麻将游戏开发游戏逻辑复杂多变,据不完全统计,全国地⽅麻将的种类已经超过上千种,不同的地⽅麻将差异巨⼤,⽐如有的没有"万",有的没有"饼",有的存在"亮倒"等操作,胡牌的类型更是千变万化,⼀些胡牌类型甚⾄有些匪夷所思(如绿⼀⾊:即⼿牌全是绿⾊的牌,⼀种东北地⽅麻将的⼤胡胡法)。
python版本: 2.7
game server( 游戏服务端 )
目录:echecs/
依赖:firefly游戏引擎 / 基于twisted框架研发而来的
web service( web端 )
目录:echecs_web_services/
依赖:tornado5.1+rpc接口
client(客户端):
目录:tpmj_new/
依赖:白鹭引擎 Egret 5.0
在wiki上对Server的分类:
Typical servers are database servers, fifile servers, mail servers, print servers, web servers, game
servers, and application servers.
其他⼏种Server我们都⽐较清楚了,跟unix差不多同时诞⽣。接下来我们主要针对web servers,game servers, and application servers进⾏简单介绍。
典型例⼦是淘宝。
特点:所有流程均由客户端发起,客户端发个请求,服务端返回个响应。⽽且,根据客户端访问的服
务不同,客户端可以向不同的具体服务端节点发起请求。
典型例⼦是王者荣耀。
特点:有⼀个⾁眼能感觉到的连接握⼿的过程,建⽴连接后,流程有可能是服务端发起(⽐如给你
展示周边玩家),也有可能是客户端发起(⽐如你移动了⼀下)。
同时,如果你⼿边有抓包⼯具,可以看到,如果你选中了某个玩家,在该玩家的头像框消失之前,
⼀直是同⼀个场景服务器在跟你通信。
典型例⼦是QQ。
特点:介于Web Server和Game Server之间,看着像⼀个web服务器,但是⼜有游戏服务器的特
点。
都是为客户端提供多种服务
都需要连接会话的概念
服务端的每台物理机服务多个客户端
都具有分布式结构
a. 会话的存在形式:
这⼀点是web服务端与游戏服务端最本质的区别。
web服务端的客户端与客户端之间交互⾮常有限,因此,服务端可以将会话保存在外部存储服务,⽐如⼀些缓存中间件、⽂件系统中间件,然后等再⽤到的时候再拿出来就可以了。
⽽游戏服务端的客户端与客户端之间交互⾮常频繁,⽐如,同场景的其他玩家会不停做不规律移动,战⽃时⼀个技能就会对复数个玩家造成影响。
这时如果将会话状态保存在外部,会造成频繁的状态存取,严重影响服务器吞吐量。因此对于游戏服务端来说,会话通常保存在进程内。
b. 交互频率与数据流向:
web服务端的频率低,⽽且数据的流动是由客户端驱动的,流向通常是客户端请求了,服务端才返回。
⽽游戏服务端的频率⾼,数据的流动⼀部分由客户端驱动,⼀部分由服务端驱动。流向除了服务端对客户端请求的响应,还有服务端的主动推送。
c. 通信协议基础:
web通信的基础在应⽤层是http/https/websocket协议。
游戏通常会实现私有的序列化协议,可以简单理解为应⽤层定义协议包结构平铺成字节流或者是串⾏序列化字节流。如果要⽀持⼀定程度的协议版本兼容,会⽤⼆进制json或者protobuf来实现协议序列化,但是通信协议本身是没有「基础」可⾔的,纯私有化协议,不具普适性,也没有必要定义成⼀种专⻔的协议。
Firefly是免费、开源、稳定、快速扩展、能 “热更新”的分布式游戏服务器端框架,采⽤Python编写,基于Twisted框架开发。
优势特性
在麻将游戏中,应⽤firefly框架后的游戏总体架构图如下:
点进⾏连接;
端节点。proxy节点地址对公⽹开发(客户端通过域名和端⼝连接);
进⾏处理,如⻓沙麻将分发到⻓沙麻将的游戏节点处理,⼴东麻将分发到⼴东麻将节点处理,该类型节
点⼀般不对公⽹开放;
游戏节点,各类型的游戏,如csmj(⻓沙麻将),gdmj(⼴东麻将), xzmj(⾎战)等。此类节点为游戏主逻辑
节点。
和退出,不负责具体业务逻辑;