Java游戏服务器成长之路——以技术角度回看我的游戏开发之路

160 阅读13分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

大家好,我是一名入行5年的游戏服务器开发,一直从事的是Java后端开发相关工作,这5年来,不敢说有多厉害,至少我经历了菜鸟的蜕变。曾经也是不懂继承多态的用意,不懂接口和抽象类的区别,不懂设计模式的精髓,不懂底层源码的巧妙的小白,而如今,我也能灵活运用继承多态,也会设计接口和抽象类,也可以把设计往经典设计模式上面靠,也敢断点进入底层查找问题所在。不算特别厉害,却对我个人而言是经历蜕变。我想以我个人的经历,给予刚入行或者准备入行游戏行业技术开发的人们一点浅薄的意见,仅供参考

从业心态

首当其冲的就是心态,不管什么行业,从业心态一定是最重要的,你是不是真的喜欢这个行业,你做个行业是为了自己的热爱,还是为了薪资,还是仅仅是随波逐流的选择?

穿越时空的对话

我们总说蜕变,总说成长,那怎么判断我有没有蜕变和成长呢?我有一个很简单的方法:闭上眼睛,想象,你的对面,坐着5年前的你,你们来一场穿越时间和空间的对话: 何小成:你好? 何大成:你好! 何小成:这就是5年后我的样子吗,略显成熟了啊,不过发型没那么酷,剪那么短干啥 何大成:哎,没办法啊,天天加班熬夜,而且我也没时间打理形象啊,最多能做到就是每天洗个头,保持一下形象了 何小成:那你现在是做什么工作啊,还在做游戏吗?我现在毕业一年了,刚从一家互联网公司的实习跳到游戏公司的实习,也不知道游戏行业怎么样 何大成:不管是互联网还是游戏行业,对于你个人的成长都没有太大的限制,你只要做好你自己,不断提升你自己就好,行业只是你努力的方向 何小成:那我能问一下,以后的游戏行业怎么样吗,我以后能不能体会到奖金分钱的快乐? 何大成:这。。。很可惜,目前为止,我还没体会到分钱的快乐,但是今年这个项目上线,我有百分之八十的把握能分一笔钱,至于分多少,就要看项目盈利情况了。 何小成:我有没有达到想吃啥吃啥,想买啥买啥的月薪水平 何大成:老实说,想吃啥吃啥,想买啥买啥,你只要一两年后,就可以了。但是很可惜,你的业余时间特别少,你也没有精力回到家再玩几个小时游戏,你也不能刷剧,也不能出去玩,你就是回到家,刷会手机,玩玩吉他或者钢琴,就准备洗漱睡觉。再说了,我现在还要存钱买车买房呢。 何小成:这么惨吗,我现在都是6点半啊就下班了啊,我下班后都不知道干啥。 何大成:如果时间多的话,可以学点东西,看看Java基础,jvm,多线程,这些东西,相信我,虽然你现在用的spring,基本接触不到这些,但是以后一定是你必须要熟练掌握的内容。 何小成:我现在觉得做游戏开发,写游戏逻辑,还是比写web开发有趣多了,我选的路是对的吗? 何大成:方向没有对错,各行各业都能玩出花来。如果一定要分对错,那就要选择自己喜欢的东西,你喜欢做游戏,那游戏就是你最好的路。 何小成:那太好了,那我以后会很厉害吗? 何大成:技术厉不厉害我不知道,反正加班是挺厉害,周末双休以后别想了,晚上9点之前下班别想了,对,就是你现在兴起的996。你感觉加班离你很遥远,是因为你是应届生,你没有什么重要的大活,你可以早早下班是因为你的功能并不重要。 何小成:未来这么难,要不我转行吧,我去做互联网吧 何大成:每个行业都不容易,在这个大环境下,我们也没有办法,没有选择,我们能做的,就是尽量提升自己的技术水平 何小成:那你现在技术怎么样啊 何大成:对于你来说,我可能是个经验丰富的老手了,可对我来说,甚至可能对5年后的我自己来说,我可能也只是个勤快一点肯加班的小开发,我的开发经验足以应付各种逻辑开发的需求,但是真正让我做决策,做设计的时候,我肯定还是不如那些十年八年的大佬考虑的周全,经验积累也是我一直努力地方向 何小成:连你都这么说,那看来我的路还很遥远啊 何大成:没事,加油,初期多沉淀自己,积累自己,你可能会比我做的更棒 何小成:谢谢你,也谢谢我自己

回想起来,如果回到5年前,我最想问以后的我自己的问题,也不过是技术和薪资。我会想要知道,我有没有变得轻车熟路,变得经验丰富,我有没有选对我当初选择的游戏这条路。 现在的我,却只想抱一抱5年前的我自己。 我没有告诉他,5年后,我没有变成大佬,5年后,我没有财富自由,5年后,我没有做出好的游戏到上线,5年后,我一直没分过项目奖金,5年后,我还是租房住,5年后,我还是坐公交上班。现实的情况,可能远不如曾经幻想的以后。

但我是不是忘了什么呢?

为什么当我回想这5年在游戏行业的经历的时候,我首先想到都是不好的事情呢,我没有分到钱,我还没有买房,我还没有看得过去的产品经历。 可是我也获得了成长啊,我自己开发过微信小游戏收入了三千块,我接过一个月两千块的外包,我获得过年终2.5个月的年终奖,我写了两本书,加起来卖了两万块,我买了电钢琴,弹得更好了,买了好的吉他,弹得更熟练了,我买相机了,能拍好看的照片了

不忘初心

当我们回头看的时候,总喜欢放大那些自己不满意的经历,却忘了我们在失去的同时,也一直在获得。都说我们爱计较得失,是说我们会在乎我们失去的和我们没有得到的,如果能反过来,我们多看看自己已经得到的,和我们没有失去的,或许会更加认得清我们自己。在游戏行业从业5年以来,我最大的感受就是要努力提升自己,在成功里积累经验,在失败中总结教训,不要太在乎得到了什么和失去了什么。人这短短的一生,能做自己喜欢的事情,就是我们最大的幸运。

我可以在这里告诉你们,游戏行业,一定是当前社会最需要的东西,在快节奏的生活里,游戏必然是人们放松的一种方式,他可能不如吃饭睡觉,但也一定是生活必须。不忘做游戏的初心,我们才能稳步向前!

从业技术

有了好的心态,还需要有更好的能力。对于游戏服务器开发来说,如何处理好高并发下玩家的操作体验,如何设计好易扩展框架,如果合理利用服务器资源,是最重要的部分。

  • 对于1-3年的开发来说,打好基础一定是重中之重,在这个阶段,你不必知道服务器架构如何设计,但你一定要知道代码怎么写才能运行更快,代码结构怎么样才能更加规范。
  • 对于3-5年的开发来说,最需要的就是从各方面提升自己的技术能力,从接口设计,源码研究,需求分析,问题处理等各方面都需要得心应手。
  • 对于5年以上的开发来说,技术方面仍然需要继续提升,并且在服务器这个方面,必须各方面都能详细了解,从网络,性能,效率,并发,多线程,算法都要更深一层的理解
  • 另一方面,从业5年以后,还需要提升另一项重要技能,就是沟通和带人。虽然不涉及技术,但也是个人整体能力的一个分支,真正好的开发,是能把自己做过的东西,在别人面前讲的一清二楚的,并且他也能很熟练的带领新人更快熟悉代码,并能开始接手工作。而沟通也是工作中能和其他同事顺利配合的保障,人类最大的特点就是协作,一群人的力量是很强大的,真正好的开发,不仅代码技术好,和其他同事的配合也是非常好的。

对Java服务器开发的建议

针对Java服务器开发,我有以下几个建议

  • Java多线程和线程安全方面的内容,对于游戏开发是非常重要的。一台游戏服务器能承载上千上万人,是绝对离不开一个好的线程模型的设计的。试着想想如果有一万人登录你的游戏服务器,而你登录用一根线程去处理的话,会发生什么事情,假设网络io用10ms,数据库处理用5ms,逻辑处理用2ms,那么一条登录消息就需要处理17ms,一万人单线程顺序执行呢?就是170s,也就是3min,就登录就花我三分钟,这游戏不卸载留着干啥呢?而如果我们合理规划登录为多线程处理,使用netty的epoll多路复用来处理网络io,用多线程来处理登录逻辑,而数据库前我们再加一层db缓存,db缓存和数据库再用一个多线程模型来处理读写,那么我们的登录将会变为飞一样的感觉。当然,以上只是我一个小小的不完整的例子。但多线程确实可以让我们更加合理的利用服务器多核的资源

  • 如果你想更加提升自己的技术,一定要掌握好JVM的相关机制。虽然我们不用手写JVM,也不用手动编译JVM,但是如果我们不了解它底层设计和实现的原理,我们可能根本理解不了它的行为,什么对象被定义为垃圾,多久触发一次垃圾回收,如何进行回收,这些问题我们可能就都不会清楚,那么我们也不会根据对应的原理去优化我们的代码。当我们发现ygc比较频繁的时候,我们可能就需要找一下我们new对象的地方,它是不是真的有必要new出来,比如我们不提倡在服务器tick中去new对象,这绝对不利于服务器的内存。当我们发现fgc比较频繁的时候,就更严重了,我们可能就需要查找一下,代码中是否有内存泄漏,是否有废弃的对象无法被释放。另一方面,如果我们了解了各种垃圾回收器parnew cms g1等的回收原理后,我们可以通过定制化的启动参数,让垃圾回收器更适配于我们的游戏服务器应用,比如定义好新老年代的比例,新老年代的大小,永久代或源空间的大小,比如g1的预估gc时间等,通过定制化参数,让服务运行更顺畅

  • 代码能力和接口设计能力也是必不可少的一部分,这部分的能力说实话不是看书或者看视频看资料就能一下学会的,这个需要在日常开发中不断积累,就算你看完Java二十三种设计模式,也是需要在不断的实战中才能逐步理解的。在我们每一个需求到来时,如果我们都花上一天时间或者更多时间,不写代码,先做分析和设计,用流程图,时序图等理清所有的需求点,再分析需求点中通用部分,在我看来,面向对象的精髓就是抽象和多态,把代码做成一个相对通用的框架结构绝对是开发中最爽的事情,当策划每扔过来一个需求,你都可以通过建一个子类,加一两行代码,或者干脆可以通过配置文件灵活配置,这个时候,你会感慨自己真的是天才,因为你的代码是一个通用的代码。相反,任何时候,你看到那些一大堆if else代码的时候,都会很烦躁,因为每次加需求,你都需要把原先代码的逻辑整个捋一遍,才知道要怎么加,不仅影响心情,也影响工作效率。在我看来,用好继承和多态,在代码设计层面来说是必不可少的一项技能。

从业信念

我认为,无论做什么事情,都一定要有信念,有了信念,事情就成功了一半。很多时候,我们会怀疑自己,为什么这么多年,我还是没有分到钱,我还是没有做出一款好的游戏。没有关系,我们可以怀疑自己,然后总结提升自己,但一定不要怀疑我们选择的这条路,如果我们对未来没有信心,那么未来也不会对你有信心。做好一件事的最初动力,一定是你那颗坚持的心。

尾声

本人从业5年,非大佬,仅从个人的一点点经验提供一些建议。总结:游戏之路,不容易,但我们都不能放弃!加油!