非科班转游戏客户端经验分享
一、前言
本文适用对象为非科班同学,科班大佬理解想必比我深刻,欢迎各位大佬指正!
在今年秋招的过程中,经常逛牛客,刷各位大佬的面经,得到了不小的帮助,因此也想写一些东西回馈一下社区。刚好目前各平台对于非科班转游戏客户端的经验贴也较少,因此写下自己转游戏客户端的一些经历和经验,希望能够给到一些类似背景的同学一点参考。
首先介绍一下本人背景,2本9硕,非科班通信工程专业,技术栈是cpp+UE,简历上一个TPS游戏项目+一段游戏客户端实习,秋招两个offer,一个大厂一个小厂。研二开学前的时候开始转码,确定往游戏方向发展,刚开始学习的时候相比科班基本可以说是啥也不会,CPP只是了解过基础语法的程度,STL是啥都不知道,408更不用说了,只在本科选修过计算机网络,其他的都没学过。
接下来大致总结一下我认为比较好的学习经验,分成算法、八股以及游戏相关技术三个部分进行介绍。
二、算法
首先这肯定是优先考虑的部分,笔试都过不去,面试更别谈了。一提到算法,都知道要刷leetcode,但是对于非科班的同学来说,啥都不知道直接开始刷题肯定是不行的,效率极其低下,也许能看懂答案,但是不知道为什么要这么写,为什么要用这种数据结构来写,刷了和没刷差别不大。因此,在刷题之前首先要有一定的基础,这个一定的基础大概就是CPP基础语法+STL中各种数据结构的特性和区别。各种数据结构的底层实现在刷题前有一个基础的了解就可以,不必过于深入,但是在刷题的过程中一定要对其进行更进一步深入的学习和理解(通常题库是按照各数据结构进行分类的),数据结构的底层实现在面试时也算是八股的一部分,有的面试官会考察的十分深入。
接下来是刷题的内容,刷哪些题,大概要刷到什么程度。首先,在开始刷题前,你已经有了数据结构方面的知识,但是还缺少算法方面的知识啊,有的题在不知道算法基础的情况下是很难靠自己想出来的。因此,首先需要了解各类算法,这方面直接跟着代码随想录刷就行,刷完了代码随想录,基本上百分之6、70的题目都是能够写出来的,接下来就是刷其他题库提高熟练度。我最开始也是刷的leetcode的hot100,之后在找实习的时候发现笔试基本都是采用的ACM模式,因此后续改成了刷牛客的在线题库,有一个面试的题库和一个笔试的题库。这三个题库之间重合度不小,但也有互相补充的部分,最开始刷leetcode,相对来说leetcode刷起来更简单,也不必处理输入输出,能够更加专注于算法。刷完一遍之后就可以刷牛客的两个题库了,面试的题库比较简单,建议直接刷笔试的题库,面试题库到快面试的时候刷刷,保持一下手感就行。刷完代码随想录+hot100+牛客笔面试题库之后,过笔试基本都没问题,最多有一道题写不出来。
虽然通常来说面试的手撕环节会比笔试的题目简单,但是也有可能面试手撕会是场景题,比如写子弹的飞行轨迹和碰撞检测这类的,这部分知识我觉得不算基础算法,应该算是游戏相关知识部分的内容。
注意:上面的题库不是只刷一遍就行,需要针对自己不擅长的部分反复刷,尽量保持每天刷题的习惯,刷多少看个人习惯就好。
三、八股
游戏客户端方向的八股基本都是CPP八股+操作系统八股,涉及一点点计算机网络,主要是TCP/UDP这部分,更多的还是结合具体场景进行提问。同时在笔试时,有的公司也会有选择题,涉及的基本也都是上面的内容。
八股我一般在阿秀的校招笔记这个网站看,面试前看一看加深一下印象。不建议死背八股,最好是自己看一遍书自己理解一遍,再去网站上看八股,结合自己的理解总结,用自己的语言描述答案。在CPP八股这方面,很多需要自己多写写代码运行看看结果,这样理解的会更深刻。
其他的计算机组成原理、编译原理相关的知识,考察到的概率低但并非没有,时间充裕的情况下也可以学一学。
四、游戏相关知识
4.1 图形学
都说GAMES101是必学课程,这当然是没错的,但是对于不同方向来说,学到什么程度是有区别的。对于游戏客户端方向,就没必要说必须要写一个软光栅渲染器之类的项目了,在我的秋招经历里,图形学的问题都是一些比较简单、基础的问题,比如点乘、叉乘的意义以及不同的应用场景之类的。
但不管怎么说,GAMES101我建议是必学的,重点不在于完全掌握所有知识,而是对渲染流程有一个整体的理解和把握,对里面涉及的一些算法的思想有个基本了解,说不定啥时候就能用上。课是肯定要看的,作业也可以做做,都挺有意思的。
4.2 游戏引擎
不管你技术栈UE、Unity还是其他啥,不同引擎虽然有不同的区别,但也有许多公有的部分。了解一个游戏引擎是怎么搭建的、包含哪些模块、不同模块的实现方法也是十分必要的。这部分内容直接看GAMES104就行,当然如果是直接开始看GAMES104,可能会觉得比较抽象,不好下手,建议是先用一个游戏引擎写一个项目之后结合着看,这样会更容易的将理论和实践结合起来,更好理解。整体我建议的顺序是:GAMES101-->项目-->GAMES104。
对于游戏客户端方向,也没必要实现一个小的游戏引擎,理解104里的各类算法就足够了,当然,受限于课时,104里面有些内容没有特别深入,因此还需要自己根据项目里面涉及的内容进行更深一步的学习,比如你项目里对碰撞检测、网络同步这方面涉及较多,那么就需要再去深入学习一下这方面的知识。
整体来说,面试时很多的场景题都能在GAMES104里找到答案,但可能不是最优的答案,因此需要自己深入的探索,多问问AI。
最后是关于引擎使用方面,整体来说大厂不太关心你引擎用得孰不熟练,更关心你是否了解引擎的底层实现也就是GAMES104里面的内容,因此,没必要花时间刻意去熟练使用引擎的各项功能。在做项目的时候用到什么记一下就行。
4.3 项目
对于我们这类游戏小白来说,第一个项目直接自己手搓是比较耗时、性价比较低的,因此可以直接找一个教程跟着做,最好是相对复杂一点的。秋招的时候一个项目也是够用的,就比如我的项目就是跟着教程做的射击游戏项目。
大厂的核心考察逻辑还是在于你的基础,也就是对项目里涉及的内容的理解够不够深刻,而不是调用了什么API,比如我的项目主要涉及碰撞检测、网络同步和延迟补偿,因此我的场景题基本都是围绕着三个反面展开和深入的,用什么算法实现的?为什么用这个算法?与其他算法对比优劣如何?还可以怎么优化?只要在场景题环节体现出你的思考,基本都没有的问题。
4.4 实习
实习这方面没啥好说的,找到实习后做了啥写啥就行,表达清楚自己做的内容,为什么这么做。同时也要多了解不同的实现方法,比如GC优化,就要多了解不同的GC原理以及GC优化方法,基本上实习和项目在面试的时候占比一半一半,只要有能聊的内容就行。
4.5 其他
其他的内容还有什么设计模式之类的,考察较多的就是单例模式,这部分内容在遇到的时候学习就行,比较简单。此外,很多游戏都是CPP+脚本语言开发的流程,比如CPP+lua,CPP+python等,因此有脚本语言基础会更好,没有也问题不大,这部分内容很容易掌握,一般面试官也不会太在意,但是必须要知道为什么需要用脚本语言进行游戏开发,这个问题在实习面试经常被问到。
五、总结
上面提到的内容,只要做到了拿白菜offer应该问题不大,至于sp、ssp要做到什么程度我就不知道了,毕竟贴主也只是一个拿白菜的菜鸟。也许多做一些项目或者多参加一些GameJam之类的比赛?可惜本人当时没机会参加
总之,以上只是一些粗浅的建议,尽早准备,图形学和游戏引擎课的作业能做就做,收获绝对对得上付出。只可惜自己起步太晚,没时间做了,可惜可惜。
查看25道真题和解析