手游服务端开发基础概念扫盲篇

No replies
Demi
Demi 的头像
Offline
Joined: 2017-03-07

策划数据与玩家数据

简单说来,策划数据就是游戏的规则,是由策划配置的。玩家数据就是玩家在游戏过程中产生的用于持久化状态的数据,需要保存在数据库里。关于策划数据,有一点需要说明的是,策划数据是不能被代码修改的。一般说来,当服务进程一启动的时候,所有策划相关数据都会被load进内存。一些新手在开始做业务功能的时候,经常发生代码不小心修改到策划数据,导致游戏规则被无意修改了。这种情况对游戏的影响非常严重,一旦出现,必定会被老大狂屌。当然,策划职位也有可能填错数据。曾经有项目因为策划不小心把投放XX个银币填成XX个钻石,短时间就发生了严重后果,据说后来数据是采用“回档”残暴解决。

pve与pvp

简单来说,pve(player vs environment),就是玩家与电脑ai对战,包括各种关卡、副本等;pvp(player vs player),就是玩家与玩家之间真枪实火地对战。一个游戏,如果只有纯pve,是不能长期吸引玩家的,毕竟打电脑打多了就会没意思。pvp一般都是一个游戏的核心玩法,也是最不好设计的,要综合平衡网络延迟及战斗表现。时下很流行的一款休闲游戏“贪吃蛇大作战”倒是挺有意思的,明明是一款单机游戏,居然能作出类似联网对战的效果。一开始,我还在惊讶于它的及时同步如此之屌,玩家的一个扭头能够及时同步到其他玩家的屏幕。然后,我试着把网络给断了,一切依旧运行得那么完美!!整个游戏除了排行榜分数是定时刷新的之外,其他都是在本地客户端跑,不过,能把ai做得这么逼真,却是非常有料的。

Socket服

游戏主进程,游戏的所有业务逻辑都在这里执行。维持着所有在线用户的socket链接。一般是采用多线程来处理用户的请求。

网关

网关就是用于服务端与客户端进行通信。跟socket服在同一个进程。用户请求从客户端发出之后,来到服务端,服务端经过业务逻辑处理,把数据返回给客户端。网关做的事情就是处理发包,解包,以及各种粘包情况。网关代码一般都非常复杂,一旦稳定就不会轻易修改。业务代码一般不需要跟网关打交道。

登录服

现在大部分游戏都是分成很多个小区,以便在单进程的环境里容纳更多的玩家同时在线。客户端手机通过渠道sdk验证后,就需要在登录服中根据平台与角色id找到玩家所在的服务分区。登录服一般是web项目,客户端通过http请求,查询玩家所在服务区的ip地址以及端口信息。有了socket地址后,客户端就可以直连socket服,完成登录逻辑。

gm工具

gm工具对于一款上线产品来说,具有不可或缺的重要性。既可以实现诸如开服关服之类的运维命令,又可实现提供给客服人员的查询玩家信息的接口,也可以辅助管理游戏进程,实现动态修改游戏逻辑的黑科技(热更新)。总体来说,GM工具类似于游戏的金手指,可以提供各种“作弊操作”和游戏管理操作。

热更新

对于一个上线产品项目来说,热更新为维持项目的稳定健康提供了坚强的保障。小到策划数据的修改,代码bug的修改,大到动态扩展游戏业务功能。试想一下,没有热更新机制,如果需要修改程序的一个小bug,都不得不踢人停服维护。这样的事情来多一发,恐怕老玩家都被撵走了。比较有意思的是,我先前的一个项目,每次更新当日,一定少不了代码热更或者数据热更,两年里的每一个星期都是如此,从无例外。可见热更新的重要性了。关于热更新的机制及方法,我的博客里有两篇文章可以参考。

防挂

做游戏后台与做web后台,关于防挂的防御思想是一致的。不管客户端发什么请求上来,即使是客户端已通过自己的验证,服务端都需要对请求参数进行有效性验证。总不能说,客户端说可以兑换100个物品,服务端什么验证都不用,就给角色加了100个物品。一定要有这样的思想,客户端完全可以通过修改包数据(加密只能提高破解难度不能杜绝)来自定义请求参数,服务端直接处理来自客户端请求的接口方法一定要有完善的参数验证机制。写的方法能否防得住挂,是区分一个初级业务狗和资深业务狗的重要标志。

用户数据持久化

玩家的数据需要保存到数据库,如果一下线数据就被重置,那么玩家每天练级还有什么意义。比较主流的数据持久方式有两种,一种是针对每一个功能模块都建一张表,只要有一个userId作为外健能关联到User主表即可;另外一种是不区别逻辑分表,对User类的所有依赖实体(包括实体及其递归依赖),全部映射成字符串或者二进制。两种做法都有优缺点。逻辑分表的优点是模块分层定位清晰、可读性强、容易通过sql修正玩家数据等;缺点是新建模块必须手动建表,实体字段必须增加表属性才能完成持久化。实体映射的优点是,只需一张表即可完成全部数据的持久化、新建属性实体或字段不需要额外修改表结构;缺点是可读性差,如果存为二进制的话更无可读性可言,而且修复玩家数据只能通过修改程序内存而不能直接执行sql语句。

另外一方面,由于数据库连接的资源非常可贵,不可能玩家每一个请求都需要load用户表。一般都是玩家登录的时候就将玩家相关的用户表全部load进内存。服务端有一个定时器检测,当玩家在一段时间内没有发请求上来,认为该玩家已经下线,相应的数据再回写到数据库。这样实现的话,对数据库的压力就变小了很多,而且在很短的时候内频繁上线下线也不会触发多次读取数据库。

游戏更新与维护

手游的更新节奏是比较频繁的,每周一更,每两周一更,最长的周期应该是每个月一更了。很多游戏喜欢把更新时间设在深夜或者凌晨,目的是想避开高峰时期,争取更长的开放时间,这可苦了我们这些做游戏的人了。无数次晚上加班到两三点或者早上6点就得赶往公司,往事不堪回首。游戏的服务器一般都是部署在Linux系统,所以常见的Linux命令都会熟悉。

最后

写给即将走进游戏服务端大坑的朋友们的心里话。游戏开发这个职位虽然外表华丽,个中的辛苦与苦逼只有局中人才能理解。如果两年后发现自己还在辛勤写着活动业务逻辑,从未碰过大型功能玩法(例如跨服赛事,战斗同步等),那你应该好好思考一下,自己是否适合继续从事游戏开发,或者这家公司值不值得你继续留下来。如果有志往资深游戏开发的路走下去,建议研究一下分布式游戏开发。毕竟,这年头,分布式还是很前沿,逼格很高的玩意。

转自:叶哓飞 - 博客园

--电子创新网--
粤ICP备12070055号