游戏服务器开发的基本体系与开发的一些建议
日志是个好东西呀,一个游戏中更不能少了日志,而且日志一定要记录的详细。它是玩家在整个游戏中的行为记录,有了这个记录,我们就可以分析玩家的行为,查找游戏的不足,在处理玩家在游戏中的问题时,日志也是一个良好的凭证和快速处理方式。 在游戏中,日志分为: 系统日志,主要记录游戏服务器的系统情况。比如:数据库能否正常连接,服务器是否正常启动,数据是否正常加载; 玩家行为日志,比如玩家发送了什么请求,得到了什么物品,消费了多少货币等等; 统计日志,这种日志是对游戏中所有玩家某种行为的一种统计,根据这个统计来分析大部分玩家的行为,得出一些共性或不同之处,以方法运营做不同的活动吸引用户消费。 在构架设计中,日志记录一定要做为一种强制行为,因为不强制的话,可能由于某种原因某个功能忘记加日志了,那么当这个功能出问题了,或者运营跟我们要这个功能的一些数据库,就傻眼了。又得加需求,改代码了。日志一定要设计一种良好的格式,日志记录的数据要容易读取,分解。日志行为可以用枚举描述,在功能最后的处理方法里面加上这个枚举做为参数,这样不管谁在调用这个方法时,都要去加参数描述。 俗话说,工欲善其事,必先利其器。游戏管理工具是对游戏运行中的一系列问题处理的一种工具。它不仅是给开发人员用,大多数是给运营使用。游戏上线后,我们需要针对线上的问题进行不同的处理。不可能把所有问题都让程序员去处理吧,于是程序员们想到了一个办法,给你们做一个工具,你们爱谁处理谁处理去吧。 六, 游戏管理工具 游戏管理工具是一个不断增涨的系统,因为它很多时候是伴随着游戏中遇到的问题而实现的。 但是根据经验,有一些功能是必须有的,比如: 服务器管理,主要负责服务器的开启,关闭,服务器配置信息,玩家信息查询; 玩家管理,比如踢人,封号; 统计查询,玩家行为日志查询,统计查询,次留率查询,邮件服务,修改玩家数据等。 根据游戏的不同要求,凡是可以能过工具实现的,都做到游戏管理工具里面。它是针对所有服务器的管理。 一个好的,全的游戏管理工具,可以提高游戏运营中遇到问题处理的效率,为玩家提供更好的服务。 七,公共组件 公共组件是为游戏运行中提供公共的服务。例如: 充值服务器,我们没必须一个服用一个充值,而且你也不能对外提供多个充值服务器地址,和第三方公司对接,他们绝对不干,这是要疯呀; 还有运营搞活动时的礼包码; 还有注册用户的管理,玩家一个注册账号可以进不同的区等。 这些都是针对所有区服提供的服务,所以要单独做,与游戏逻辑分开,这样方便管理,部署和负载均衡。 还有SDK的登陆验证,现在手游比较多,与渠道对接里要进行验证,这往往是很多http请求,速度慢,所以这个也要拿出来单独做,不要在游戏逻辑中去验证,因为网络IO的访问时间是不可控制的,http是阻塞的请求。 所以,综上来看,一个游戏服务器起码有几个大的功能模块组成: 游戏逻辑工程; 日志处理工程; 充值工程; 游戏管理工具工程; 用户登陆工程; 公共活动工程等。 根据游戏的不同需要,可能还有其它的。所在构架的设计中,一定要考虑到系统的分布式部署,尽量把公共的功能拆出来做,这样可以增强系统的可扩展性。 服务器端开发的一些建议 本文作为游戏服务器端开发的基本大纲,是游戏实践开发中的总结。 第一部分 —— 专业基础,用于指导招聘和实习考核; 第二部分 —— 游戏入门,讲述游戏服务器端开发的基本要点; 第三部分 —— 服务端架构,介绍架构设计中的一些基本原则。 希望能帮到大家! 一、专业基础 1.1网络 1.1.1理解TCP/IP协议 网络传输模型 滑动窗口技术 建立连接的三次握手与断开连接的四次握手 连接建立与断开过程中的各种状态 TCP/IP协议的传输效率 思考: 请解释DOS攻击与DRDOS攻击的基本原理 一个100Byte数据包,精简到50Byte, 其传输效率提高了50% TIMEWAIT状态怎么解释? 1.1.2掌握常用的网络通信模型 Select Epoll,边缘触发与平台出发点区别与应用 Select与Epoll的区别及应用 1.2存储 计算机系统存储体系 程序运行时的内存结构 计算机文件系统,页表结构 内存池与对象池的实现原理,应用场景与区别 关系数据库MySQL的使用 共享内存 1.3程序 对C/C++语言有较深的理解 深刻理解接口,封装与多态,并且有实践经验 深刻理解常用的数据结构:数组,链表,二叉树,哈希表 熟悉常用的算法及相关复杂度:冒泡排序,快速排序 二、游戏开发入门 2.1防御式编程 不要相信客户端数据,一定要检验。作为服务器端你无法确定你的客户端是谁,你也不能假定它是善意的,请做好自我保护。(这是判断一个服务器端程序员是否入门的基本标准) 务必对于函数的传人参数和返回值进行合法性判断,内部子系统,功能模块之间不要太过信任,要求低耦合,高内聚。 插件式的模块设计,模块功能的健壮性应该是内建的,尽量减少模块间耦合。 2.2设计模式 道法自然。不要迷信,迷恋设计模式,更不要生搬硬套 简化,简化,再简化,用最简单的办法解决问题 借大宝一句话:设计本天成,妙手偶得之 2.3网络模型 自造轮子: Select, Epoll, Epoll一定比Select高效吗? 开源框架: Libevent, libev, ACE。 2.4数据持久化 自定义文件存储,如《梦幻西游》 关系数据库: MySQL NO-SQL数据库: MongoDB 选择存储系统要考虑到因素:稳定性,性能,可扩展性 2.5内存管理 使用内存池和对象池,禁止运行期间动态分配内存 对于输入输出的指针参数,严格检查,宁滥勿缺 写内存保护,使用带内存保护的函数(strncpy, memcpy, snprintf, vsnprintf等) 严防数组下标越界 防止读内存溢出,确保字符串以' |