6

5年游戏服务器开发的升级之路

 3 years ago
source link: https://gameinstitute.qq.com/community/detail/133657
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【本文参与GWB有奖征文活动】

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

从业心态

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

穿越时空的对话

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

0mU8yhRRIacjZCQFqjDs.jpg

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

但我是不是忘了什么呢?

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

不忘初心

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

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

从业技术

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

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

对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代码的时候,都会很烦躁,因为每次加需求,你都需要把原先代码的逻辑整个捋一遍,才知道要怎么加,不仅影响心情,也影响工作效率。在我看来,用好继承和多态,在代码设计层面来说是必不可少的一项技能。

从业信念

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

rJlQ9JkMSfoiYEXJv1LW.JPG

尾声

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK