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

标签: 手游服务端基本技能java
3809人阅读 评论(4) 收藏 举报
分类:

13年毕业后,做了一年半web开发,因为受不了在客户现场工作的氛围,愤然辞职。转行做了一名手游服务端开发。

在广州,据我所知,选择java作为服务端开发语言的大厂大概有37玩,百田,银汉,易娱等等。其实游戏服务端开发语言可说是百花齐放,c++、java、python、elang,不一而足。

记得刚入坑的时候,我连策划数据和玩家数据都傻傻分不清,服务进程还天真地认为是tomcat启动的。被策划与测试联手虐待了近3年后,我终于成为一名有经验的“业务狗” (=。 =

下面说一下手游开发中碰到的一些名词。这些概念都是自己理解的。刚入坑的朋友可以草率看一看,瞧一瞧。资深游戏开发请留下联系方法,方便请教问题。(^-^)

架构是简单的服务器架构,也就是说,大部分业务处理都是在同一个进程。没有分布式服务的概念。

996

提起游戏公司,比较受众人认可的便是它高强度的工作时间。从刚开始的996制度(每天上午9点上班,晚上9点下班,中间休息2个小时,每周6个工作日,到后来的9106,甚至9116,简直是残暴剥削从业者的剩余价值啊。不过,不加班的游戏公司估计也没多少人敢去上班,工资能不能按时发都是未知数了。也许有些人会说,游戏行业工资高,奖金多。说点心里说,虽然游戏行业普遍工资是比较高,但综合工作时间考虑,性价比奇低。近几年来,手游行业发展迅速,每年都有非常多的手游工作室成立,当然,也有很多手游公司倒闭。总体来说,手游这块大蛋糕已被市场瓜分所剩无几,特别是腾讯和网易两个大厂就拿了七成左右。利润减少,人力成本增大,导致很多手游项目的奖金已悄悄地被砍掉了,大部分项目成员最多就是年底拿个双薪。(=。=)

策划数据与玩家数据

简单说来,策划数据就是游戏的规则,是由策划配置的。玩家数据就是玩家在游戏过程中产生的用于持久化状态的数据,需要保存在数据库里。关于策划数据,有一点需要说明的是,策划数据是不能被代码修改的。一般说来,当服务进程一启动的时候,所有策划相关数据都会被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命令都会熟悉。


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


2
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:101491次
    • 积分:1421
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:0篇
    • 译文:0篇
    • 评论:27条
    博客专栏
    最新评论