这是我踏入社会工作以来第二次面试,第一次是在校期间内推进的游戏公司,而且我本身是搞算法的,所以面试纯考算法。本身情况也比较特殊,所以可以说是完全没有面试经验。也因此准备了很多东西,走了很多弯路。觉得好的小伙伴请记得“点赞,硬币,收藏,素质三连!哎呀,走错地方了,告辞!手动滑稽”。
因为我是当成日记在写,无论是技术细节还是其他会写得比较详细。我也担心直接被有心人事直接拿去贴自己简历里,不过我要提前说的是,别妄想这么做去大厂面试,背调这些都能查得出来,如果不想给自己找事的话,还是别这么做。
再一个是我也不希望和怕触碰到“高压线”,所以我个人不会去谈具体的薪资和福利,如果我哪里触碰到了“高压线”或者说是比较敏感的问题,也希望能够留言或私信给我,我会立马删除。我主要是本着一个让大家了解面试流程,帮助大家做一些准备工作,以及缓解大家焦虑这么一个心态在写这篇博客。所以我也是希望在帮助到别人的同时,可以保护好自己。
本面经会涵盖我面试期间焦虑和会去思考的一些问题,那么下面正式开始
2月7号周五投腾讯社招网站
2月17号周一:收到Hr通知会安排技术面试
2月22号周六:第一次技术面试
2月27号周四:电话通知29号会有两轮视频面试,收到短信和邮件
2月29号周六:两轮视频面试
3月1号周日:收到进入评估短信
3月2号周一:Hr加我微信,让我随时准备Hr面试
3月4号周三:收到Hr电话,让我3月6号上午11点准备复试面试
3月6号周五:收到Hr电话,谈了离职理由、职业规划、为什么当时不选择其他大厂去发展、当前薪资以及期望薪资、定级
3月12号周四:因为一直没收到Hr的消息,所以主动去问了进展,他说最近太忙了,明天会跟我确认薪资
3月13号周五:等了一天依旧没收到Hr电话,到晚上快6点下班时间了,自己发了微信询问情况,然后电话联系,发了口头offer
3月16号周一:收到雇前背景调查邮件,填写并上传相关图片
3月17号周二:收到正式offer邮件
3月20号周五:收到Hr电话,让我邮件回复离职证明以及告诉我背调有一个同事联系不到,让我跟他时间
3月23号周一:收到“腾讯新员工入职指引”邮件,要求上传个人资料和图片。几个小时后收到“入职信息审核通过邮件提醒”以及“无接触 腾讯E入职提醒”(疫情期间让我远程入职和远程办公)的邮件。
3月25号周三:收到HR安排好酒店的电话,并通知我3月31号可以前往酒店入住。
3月31号周二:当天晚上收到短信,让我4月1号网上办理远程入职手续。
4月1号周三:早上8点在酒店准时起床签约,下午收到企业帐号密码,导师秘书联系方式等。
4月2号周四:酒店办公,导师让我看一些新手指引,完成一些作业。以及社招群里会有一些破冰和培训。企业帐号生效,可以看防疫视频。
4月3号周五:原本今天可以领取工卡去到办公地点,但因为一些原因继续酒店办公。
4月7号周二:正式领取工卡,去办公地点上班。
腾讯的面试周期迷之长,我上知乎看过了,我这不是特例,算是一个比较正常的情况,听说大厂一般都1个月打底。之前没经历过到大厂的面试,这次真的长见识 了。这一个多月每轮面试完,我都特别自信,觉得稳得一批,结果硬生生让我等到怀疑人生。而且我是原本在上海工作,老家在广东,为了不影响面试,我还裸辞了。只能说幸好我不缺钱没有经济负担,而且对自己能力也比较有信心,所以这一个多月的等待除了说迫切想知道结果的心理使得我比较烦躁之外,基本也没啥心理负担。所以我也是建议,如果要面试大厂最好要有心理准备,而且腾讯一般面试会约固定时间的,而且我几场下来都是在周六面试,不知道是不是约定俗成的,所以我觉得不是特别需要担心会影响到现在的工作,建议不要裸辞!因为我这段时间等得比较不耐烦,基本把知乎以及网上帖子都看了些,看过一些比较极端的例子,有面了4个月,6个月,面完一直不给通知的,甚至说最后给offer然后说offer取消的都有。有6轮面试的,8轮面试的,有些人因为有通道委员会定级面试而多几轮的,反正因素很多。然后比较平均的应该是总共3到4轮面试,周期到1到2个月。
还有我建议在收到Hr电话以后,一定要跟Hr要微信,我2月17号和3月6号的Hr分别是两个。第一个我当时没要,原因是我当时扮演的是一个被通知者的角色,没有这个意识去要。而现在来看的话,我当时最好是要来微信,不然如果我1个星期内没收到任何面试通知的话,我可以找Hr反馈。Hr其实也希望招到人完成指标,所以不要不好意思,你们是同一战线的。而第二个Hr,当时是他主动给了微信。从上面的时间线也可以看出因为快一周没消息了,我希望在最后一个工作日得到答复,所以选择了周四联系Hr,最终也是能够在周五得到了满意的答复。所以有时候Hr比较忙或者忘了,是可以适当联系Hr的,我个人觉得六七天联系一次也不算太打扰到别人。
因为有些公司采用的是避税的方式,这个没什么好隐瞒的,可以直接跟Hr说清楚。基本上你到手的工资加上你交的五险一金就可以作为你谈判时的税前工资,当然比较靠谱的是你离职时候公司开的收入证明。腾讯也会要求你出具银行app的流水截图来证明你的当前收入,所以不要试图隐瞒自己的实际收入。
很多人比较关心背调,腾讯的背调是委托第三方机构执行的,一般需要填写的信息包括个人信息、学历(需要上传毕业证截图)、最后两段工作经历(每段工作经历需要提供公司名、部门职位、入职离职时间、离职原因、一名直属上级联系方式、一名同事联系方式、是否填写竞业协议、备注)、是否有犯罪记录、是否有直系亲属在腾讯、有没重大疾病史。
尽管我简历没有造假,但我自己在填背调的时候也遇到了以下一些问题:
1、我第一段工作的入职时间,我简历上写了我毕业那年的4月份,而其实我是2月份开始实习的,我忘了我我真实的实习时间是2月开始只凭印象所以才写了4月,这个我在背调Hr打电话给我的时候我就向她说明了。她说让我填劳动合同上的时间,也就是我毕业那个月的时间。因为我也不是故意拉长我的工作年限,所以我在第一段工作的备注上写明了简历上的时间包括了实习的时间。也是希望可以得到谅解
2、由于我第一段工作入职的时候给我的岗位是“游戏服务器开发”,但因为项目或者人员调配等原因,我至始至终都没接触过服务器相关工作,离职的时候给的离职证明上面写的也是“游戏服务器开发”,因为调配岗位的时候没有重新签合同。而实际上我的工作更像“算法工程师”以及“游戏客户端开发”,然后我还当过项目负责人,这些都没法在离职证明上体现。所以我也是怕被认为是造假,所以我也是进行了备注。
3、简历上的公司名字跟合同上的对不上,我是在填背调的时候才发现的。我的情况是这样的,我简历上的公司是大公司名,然后合同上的是这家公司的一个子公司,简单的说就好比简历上写的是腾讯,然后实际合同上是旗下某工作室。但大家都在同一个地方上班,平时对于自己工作室的观念都不是特别强,都只记着自己是这家公司的员工,大概就是这种感觉。总之也备注。
4、我第一段工作经历和第二段工作经历都是同一个团队,第二段工作经历是因为第一家公司裁员后,团队领导带我们出去创业。所以我两段工作经历都写了一样的直属领导联系方式和同事联系方式。并进行了备注,第二天Hr打电话告诉我不允许两段工作经历填相同的联系人,因为我直属领导只有一个,这个事实没法改,就让我提供另外两位同事的联系方式。即使是说这两位同事都跟我情况一样,都在这两家公司呆过也不要紧。
5、要记得提醒你的同事接听未知来电以及选靠谱的同事。背调的时候有一个同事以为是骚扰电话就没接,我真的是日了狗了。而且跟Hr约好跟这个同事的背调联系时间之后,在约好的时间竟然没带手机去吃饭,而错过了约好的时间。不过幸运的是,后来他有跟背调公司联系上。
所有同事背调完,应该很快就会收到“腾讯新员工入职指引”,说明通过背调了。因为期间我没有收到Hr的电话联系说我背调有什么问题,所以可以说明只要不是刻意造假隐瞒,上面这些问题基本不会有太大问题。背调结果Hr不一定会通知,至少我直到要入职了Hr都没通知我背调结果,所以我觉得背调通过的证明就是收到“腾讯新员工入职指引”。
我个人觉得我简历做得还挺不错的,我当时考虑了几个亮点,首先一个是我ACM的获奖确实含金量还行,说实话搞过ACM的人写代码的速度和思维能力确实比其他人快,大学认真搞的话不夸张地说几乎等价于比别人多了4年工作经验。为了更好地表现简历以外的东西,我有预谋地在半年前开始维护这个好几年没发过文章的博客了。然后就疯狂把自己这几年来积累的知识都写到博客上,提早半年写也是防止被看出来说是专门为了应付面试。最后就顺理成章地把博客地址写到上面,万一面试官看我的博客大概也能看出我是个什么水平,并且也能说明自己是个善于积累和总结的人,其实利大于弊。有玩github或者其他的话也可以写上,主要我个人没有开源的心,比较自闭,所以从来不搞github。专业技能的话,切忌不要说“精通”,这年头说自己精通啥的都得死。所以哪怕某方面特别牛逼,也最好谦虚点,写个熟练掌握或者熟悉。像我写的是熟练掌握C++、数据结构、设计模式,具备图形学基础,熟悉DX及OpenGL的Shader编程,有优化算法和性能的经验。个人觉得写太多专业课程没多大意义,可能还不如直接写你看过哪些书是跟这个岗位比较相符的。我的个人经历确实只有两份,但做的内容却不少,硬要我写的话,一页纸肯定写不下,我侧重挑的都是有技术含量的。我想大部分人都是像我一样,随着经验提升,最后一份工作往往能有更不错的表现,所以可以多写写最后一份工作。然后工作内容体现不出来的东西,可以写上业余研究,还能表现你的涉猎领域以及证明你是个业余还好学的人。后来也证明了业余研究写了确实有用,每个面试官都问了相关的问题。自我评价的话,也是尽量避免了假大空,我是通过简历上说我因为搞了ACM所以怎么怎么样,因为我是项目负责人所以怎么怎么样,以及懂得什么技术可以促进或者提高啥,要有理有据。而且我个人觉得也没什么人会管你的自我评价,所以占的篇幅比其他都要少。再一个我觉得Hr或者技术官懒得看那么多页的简历,所以最好使用一页简历。我见到过有些人的简历工作经历写了一大堆,都是没啥技术含量的,还容易分不清主次重点,要概括性介绍,只需要介绍你干了啥,不需要介绍你怎么干的,最好列的都是独立完成的工作。因为面试官会手撕你简历上的东西,所以没必要把怎么实现放在简历上占篇幅。如果涉及到其他人的工作,到时被问倒的话就很尴尬。为了防止说Hr连看完我一张简历的时间都不给,我甚至为了凸显自己的亮点,动手P了右上角的Tips,然后把自己的一些优势和亮点更概括地写在了上面。最后将文件名改成修饰一下,姓名必不可少,用比较简短的词语凸显个人的能力。一个作用是方便Hr根据名字找文件,另一个是能让Hr觉得你有能力,很牛逼。这里我也提下,期望薪资面议就行了,因为有定级,所以最好等定级出来了,根据定级和之前工资在涨幅30%的范围内可能可以谈。
注意!入职和离职时间不要写错,腾讯很注重诚信,企图隐瞒一些工作经历或事实的话,如果背景调查查出来的话就等死吧。所以我建议去翻翻你的一些聊天记录或者朋友圈说说啥的找线索,不要凭记忆觉得差不多就填了。我当时第一份工作实习的时间就是凭记忆填的,结果比实际的少了两个月,我都慌得一逼。
以上是我个人看了一些简历贴,以及揣摩了下Hr心理,从而想的一些做法。不喜勿喷,觉得没用也没关系,反正我觉得有用就行了。当然简历模版是不可能给你的。
虽然网上看都建议内推,说是可以方便查询结果,提高整个流程的效率。但是由于我常年在上海工作没有腾讯方面的朋友,而且比较羞于交际,所以并没有网上找人内推,总觉得不想欠别人人情,何况还是陌生人,说白了就是懒。真男人,决定自己直接刚正面,我先是Boss直聘上填简历并且上传pdf,主要当时觉得Boss直聘上可以看该岗位整体大概的一个行情。而且找薪资范围高一些的Hr,觉得心理会稳一点吧,主要因为在上一家公司是团队核心工资较高,怕入职工资不升反降。(现在我可以明确告诉你,Boss直聘上的薪资并没有什么卵用,可能非大厂有参考价值,但腾讯肯定是没用的,所以别太妄想说一定能拿到Boss直聘上薪资的中位数。腾讯有明确的职级体系,会根据你的能力定级,如果定级的薪资范围比你上家公司给的钱少,那大概会降薪吧,这我没经历过所以只是猜测。而如果你比较牛逼,定级比较高的话,你的薪资涨幅应该也不会超过30%,毕竟是大厂不会随便给你超过30%的,因为我刚好就是这种情况,所以我知道。。。所以Boss直聘就当成联系Hr的渠道就行了,能安排面试就行)
我是在大年初三把自己简历挂到Boss直聘上,因为对自己比较自信,所以想等等看,看看有没腾讯Hr来撩。结果事实上是我想太美了,一堆岗位不符合、薪资不在考虑范围的Hr来撩,就是没有腾讯。等了得有一个星期,没办法我就只能主动出击了,但Boss直聘的机制是得Hr同意才能发简历给他。于是乎,我直接看到相关岗位后直接私聊腾讯Hr,没有做太多的描述,完全用Boss直聘默认设置好的快速留言,希望请求同意能将简历发给对方。事实证明这种做法是很没诚意,以及见效低的。
结果第二天一看已读没回,我自认为我简历质量挺高,但由于我是有UE3和自研引擎经验然后投的UE4岗位,担心Hr不识货觉得我没有UE4经验无法胜任,所以一方面我开始在腾讯社招网站上投简历,另一方面我开始用同样的方式问腾讯Hr,结果依旧已读不回。思前想后就上知乎上看了,总结下来就是我发言太直男了,没有新意,Hr估计一天会看太多,直接给筛掉了。所以我得出一个结论就是把私聊Hr时的默认回复关了,自己编辑一个。此外,因为Boss直聘不能发简历,但是可以发图片,所以可以将自己pdf简历转成图片,然后上来先是一通饱含热情和谦卑但又不痛不痒的发言,直白地说就是麻烦看下我的简历,最后简历图片贴脸给对方发过去。我这么做的前一天晚上,因为腾讯社招也快一个星期没回复了,所以我想起来将之前项目做的一些东西编成几个exe并附上txt作为exe一些实现原理的描述,整个打包成压缩包上传到社招网站个人简历的个人作品里面去。主要是我之前做的粒子编辑器、描边Demo、战争迷雾Demo。
然后第二天一早十点就收到社招网站Hr的电话了,距离大年初三刚挂简历那会过去了整整两个星期。Hr主要也只是问离职原因,介绍我投的岗位情况,并告知将会通知该岗位技术人员看我简历是否符合条件再决定是否面试。等到跟Hr聊完之后,Boss直聘的Hr也终于回复了向我要pdf文件。我问了下今早联系我的Hr是不是同一个人,回答不是。估计是简历贴脸战术成功了,当然我这么问的话也把两个Hr同时联系我的问题抛给了他们,因为我确实也不知道怎么应付这种情况。至于社招Hr的话,不确定跟上传作品有没直接关系,毕竟过年积攒的简历太多估计可能看不过来吧,也可能没有作品所以优先级比较低?具体原因不明
我是在周一收到Hr电话的,结果一直等到周六下午三点才第一次收到技术面试官的电话,直接就给我肾上腺素拉拉满了。一开始我显示器还开着操作系统相关的知识点,说着说着感觉情况不对,上来直接撕我的工作经历,而且一点要问其他东西的势头都没有。我就抱着电话直接上床聊了。毕竟我对自己的项目经历还是挺自信的,手撕完全不虚。可能对于一些同学来说,我的项目经验没有什么参考价值,毕竟每个人的成长路线不一样,而且我还是剑走偏锋,特别偏那种。
我说下整个过程,上来是先让我自我介绍,这点我没做太多准备,就直接回忆简历上的东西,这样挺亏的,错过了很多表现自己的细节。因为我做过地形编辑器,所以也是介绍了下他是用模型拼装而非Landscape那一套。然后讨论有没用LOD,我当时以项目还在开发阶段就没做为理由,其实后来想想其实因为Moba游戏镜头相对固定,很少看远景所以LOD用处不是特别明显。并且我们开发的时候遇到的主要问题是DrawCall太多,换低模也解决不了问题。大概是准备不充分,只说了第一条。
然后问了我怎么优化模型多的问题,我说了Foliage Instance那一套,还提了说因为编辑器模式下可能要实时修改顶点色,导致没办法用Instance,提了最终为了运行效率,发布到游戏前会对没法进行Instance的模型来一次离线合并,把材质相同的合并到一起。问了我Instance是怎么传数据的,我说了两个VertexBuffer,然后一部分顶点数据是PerInstance的。然后他问我为啥因为修改顶点色就不能用Instance,难道Instance不能传数据吗? 我回答了Instance适合传少量数据类似Transform这种实例级别的,而对于顶点级别的话顶点数量太多的话是不行的。但是可以通过将顶点色存到Texture里,然后在顶点着色器里采样顶点色来实现。只不过当时比较年轻,不知道可以用这种方式实现
接着问我粒子编辑器,粒子的实现原理,我介绍了普通粒子、飘带粒子、模型粒子、Beam粒子分别的渲染方式。然后问了我Billboard是怎么实现的,还好这部分我留了个心眼,很早之前就写了相关博客直接就回答了。然后他问我CPU层面和GPU层面粒子如何实现,我有点没太理解这个问题,不知道他是想问我,粒子在CPU层面和GPU层面分别干了啥,还是问我GPU粒子怎么实现的。反正我是把CPU粒子和GPU粒子都说了一遍,也庆幸我在离职前还研究了GPU粒子。
然后看了简历,问了我项目做的UI优化,我介绍了UI如何通过算法优化减少布局控件的遍历。说完本来想说优化DrawCall的,但完全回忆不起来这个词,幸亏想起来优化了OverDraw,就把改变遍历顺序,从前往后遍历,来渲染不透明物体,给它赋个深度值然后通过深度比较的方式减少OverDraw。遍历的时候将透明物体存起来,之后倒着遍历就变成从后往前渲染透明物体,来保证透明物体的正确性。接着面试官提醒了我简历还写了优化DrawCall,我也就承认说我之前想说的是这个刚才给忘了,然后说了下我会将渲染状态相同的UI收集到一起,让它们在VertexBuffer里连续的区域,让它们一个DrawCall进行渲染。接着他问了我一个项目没接触到的功能,对于静态和动态UI的处理,因为没经验,我答的是划分好区域,设置Tick时间,让静态UI更新频率更少一些,动态更新更频繁一些。
最后问了我业余研究和开发,我因为写了研究Decal的实现,所以他就问了。我一开始讲的是UE3是通过遍历Decal所覆盖到的模型的所有三角面,将面朝Decal的三角面作为Decal的三角面。这种做法的性能开销比较大,因为曾经项目把Decal弄在整张地图上发现性能特别差所以才特地去研究。说完之后我又提到延迟渲染的方案,主动去提G-buffer相关有哪些数据,天然支持Decal。然后面试官终于有反应了,感觉他就是等我说出这个答案,然后他就说这也是UE4上面的做法。
面完之后就开始介绍工作室情况,以及申请的岗位正在开发的游戏情况。我就将我之前想的一些问题说了下,其实知不知道结果对我来说不重要,我只是单纯地想留个好印象。主要也是问了我如果入职的话,主要负责什么,以及对我有什么期望,希望我哪方面有提高。意料之中地说让我学习一下UE4相关的知识,然后结束了面试。并通知说之后还有两到三轮面试都会在一周内解决。我也顺便问了下,需不需要远程面试,类似远程敲代码,主要是想确认下,因为我没有麦克风然后也没怎么测过笔记本的摄像功能,加上疫情比较严重,大概率除了电面就是视频面试了。他说看面试官风格了,不同面试官做法不一样
我自己感觉下来的话,全程虽然没有像我预期那样,把我所有闪光点都表现出来。但他的问题我基本回答出来了,最终也是一个明确的答复会有下一轮面试,所以我个人认为第一轮面试还是表现得不错。但回想起来介绍自己的时候还是有一些不足,所以当天晚上就把自己的详细介绍写了一下,包括实战各个方面细节都记录下来,主要是怕自己漏了或忘了,写了三千多字。不过最让我懵逼的是,除了项目经验啥也没问,总感觉跟我想象的不一样。反正我就当例外吧,继续专心梳理曾经做过的东西
第一次技术面结束的第二个星期四,我收到了Hr的电话。通知我要视频面试,然后我也是说我一直没测试笔记本的摄像功能和麦克风功能,需要试一下。总之最后Hr说稍后会收到视频面试的时间,过了几个小时之后,收到了视频面试通知,后天也就是星期六有两场视频面试,分别是15:00-16:00以及16:00-17:00。
反正我也是紧急试了下曾经在全家买的耳机,跟苹果耳机线差不多带麦的那种,发现根本笔记本收不到它的音,当天下午就去电脑城买了个五十几块钱的破耳麦,花了两小时,把整个环境弄弄好了。
知道确切的时间之后反而更慌了,我重新将整理到的各方面知识点重新看了一遍,本来IBL都打算放弃了,最后挣扎了一下,当晚给弄明白了。第二天花了点时间做小抄,把我一些容易忘的点,其实大部分都不是特别常用所以根本记不住。例如两道算法题的推导公式,OpenGL的常用的API名,包括贴图、混合、创建Link使用Shader、设置Uniform、顶点数据设置,投影矩阵推导,排序算法复杂度表,PBR+IBL 全都写了下来,A4纸正反面写满了。然后也测了显示器摄像头的死角,保证在眼皮底下作死不会被发现。
小抄弄完之后,当天直到第二天早上整个人都处于一个非常佛的状态,没啥可看的了,就开始看看视频打打游戏。面试当天12点起的床,说实话饭是勉强吃下去的,可能整个人比较紧张没胃口吧。然后洗了个澡稍微整理了下仪容,就开始准备面试,测试设备完之后,就开始听音乐玩手机缓解下紧张。
反正我是提前了半个小时,基本上每隔个十分钟或者十五分钟进去一次面试房间。最终这第二位面试官也是迟到了几分钟后出现,然后就开始面试。上来也是先让我介绍下自己,因为有先见之明 ,所以基本上把自我介绍中我想讲的都讲出来了。然后就开始撕我骨骼模型相关的东西,我也是主要介绍我当时项目里遇到GPU寄存器不足,导致如果模型骨骼超了的话会有问题的情况。然后先讲了CPU蒙皮,虽然解决了骨骼限制,但是CPU性能开销很大。然后介绍了用分ID的做法保证每个ID只传影响它的骨骼到GPU,然后提了如果两个模型公用骨骼的话可以只计算一遍骨骼动画的优化。最后介绍了因为微信小游戏CPU骨骼动画性能较差,所以实现了GPU动画。然后问了我是怎么处理的GPU动画,我说是将每一帧动画的骨骼的矩阵都写到Texture里,然后一个矩阵12个浮点数,RGBA专门用来存一个浮点数,然后GPU再转回浮点数。接着他问我是只存一个动画还是所有动画怎么处理,我说了一张贴图存了所有动画每一帧的骨骼信息。然后他问我有没对贴图数据进行压缩,因为一来我没有压缩这方面的经验,再一个当时情况能实现就不错了。所以我也就实话实说了。接着问我这张Texture大概多大,我确实对计算字节多少不是特别在行,就大概提了一下当时微信小游戏只能用正方向贴图,并且确实存在浪费,右边和下边的区域都是空出来的。最后也是说我记不清了,好像最后说了是两兆左右,只是凭印象,具体真的忘了。也提了说当时解决不了的问题是在GPU里做动画融合,因为查了下在GPU做矩阵插值本身不是一个正确的做法,接着说了有想过说在GPU里把矩阵转成四元数再把四元数转到矩阵这套实现,但因为当时遇到两个动画插值的时候临时寄存器会不够用。可能面试官也没经历过微信小游戏上的开发,他也疑惑说不是解决了GPU骨骼限制了吗为什么还会超寄存器,我就说到说的超寄存器不是指的Uniform那些而是临时寄存器,类似栈上的那种,网上查了下报错原因是临时寄存器超了,我就提了微信小游戏相比app条件要稍微苛刻一些,然后他就说我这个情况比较少见就过去了。骨骼模型相关最后还问了我GPU动画Instance相关的,就是针对相同动画的模型有没进行合并,我确实写了GPU Instance,不过没用上实话实说。然后他问了下采样什么样的一个合并策略以及怎么进行更新,我说了位置变动就进行更新,并且合并也是按区域合的,合并的条件是它们是材质相同的模型,视锥体并不会影响整个合并策略,所以确实可能出现屏幕外的如果是同一个批次会一起渲染。然后他也理解,因为是自走棋,大部分都在屏幕内,这样做反而省事。
接着因为骨骼动画就问了我引擎多线程相关的是怎么实现,我说了是一开始创建好多个工作线程,然后工作线程每帧都会加锁去拿工作队列里的任务,当我执行那些需要并行处理的任务,例如Update或者处理骨骼动画的时候,我会创建任务抛到队列里去,然后工作线程就开始跑,主线程也是while查询直到所有工作线程处理结束。然后问了我这个时候主线程处于空置状态不会浪费吗,我补充到其实主线程并没有空置他在处理任务的时候,有将任务进行均分,主线程跟工作线程同样的工作量,只是最终会等待所有人完成。这个过程中,我也补充到我们引擎并不像UE一样有单独的一个渲染线程。他就假设说我现在有充足的时间和精力去修改和设计整个多线程我会怎么设计,我回答了首先是跟虚幻一样有个单独的渲染线程,其次在有工作任务抛给工作线程的时候,主线程可以继续往下跑,除非遇到说有要依赖之前工作任务的,则就需要主线程停下来跟工作线程一起处理。因为我确实没有这方面经验,也没有时间多想,只能想到这么多。
当他想问C++的时候,说我一直用C++开发游戏对C++应该很熟吧,然后会心一笑,似乎是在笑我简历没写精通C++。然后我说还行吧,然后他就开始提问function的作用以及跟函数指针的区别,我说了可以延迟调用,以及它可以绑定对象指针,是对对象进行操作跟符合面向对象的思想,能修改对象的成员数据。而函数指针则是面向过程,更像是个全局的数据的处理。然后他还说这是概念上的理解还有哪些功能,我只能回忆起说绑定默认参数,但并不是他想要的答案,他说可以绑定lambda,lambda表达式的用途还能获取上下文的数据。我知道lambda表达式的作用以及可以通过引用获取上下文,然后说了我确实没用function传lambda(后来我上网查也没查到这种用法。。。),因为主要我的编程习惯是在用到的地方写lambda,不会把函数抛出去,主要是为了代码可读性考虑。再一个是问的智能指针,问什么情况下shared_ptr会出现循环引用,以及解决方案,自然是两个shared_ptr互相引用,将其中一个改成weak_ptr。然后问了我weak_ptr和裸指针的区别,老实说原理性的东西我记得比是特别清楚,跟面试官说我以前有查过,然后有点忘了,我也不知道为啥就直接把答案给说出来了(大概是我潜意识以为我不会,但其实我会。。。)。是因为weak_ptr可以监控智能指针的合法性,weak_ptr可以判断智能指针是否释放了,比裸指针更安全,裸指针如果指向的内存被释放了直接用就会导致崩溃
然后问了我UI优化相关做了什么事情,我就按照跟第一个面试官回答的东西差不多回答了。问了贴花的实现,还问了战争迷雾的实现原理。回答完之后,他问了我如何将屏幕坐标转世界坐标,因为战争迷雾有部分是借鉴了其他代码,有些是照搬,所以有些原理当时做的时候没摸清,刚好面试前一天想起来,赶紧起来看了代码,所以稍微卡壳地回答了,因为当时没有细细品它的原理,所以主要还是怕回答错。通过将屏幕坐标乘以VP矩阵的逆矩阵从而得到向量,再通过乘以深度值得到世界坐标。然后他就问了深度信息怎么得来的,是有depath buffer还是有专门的depth pass,因为用的是前向渲染,所以我回答了说专门的depth pass。接着问我depth buffer和depth pass这两个使用环境该如何取舍,一开始我其实不是特别清楚他说的depth buffer是不是g-buffer中的那个,所以我说了像延迟渲染那种,天然自带了depth buffer,可以给decal直接用。而如果是前向渲染没有depth buffer的话就只能用depth pass。
最后也是照例介绍岗位项目,以及让我提问题,我也还是提那些老问题。整趟下来完全在撕工作经历,撕了整整一个小时,到了下一个面试官的时间了才停。整趟下来神清气爽,发挥得也还算完美。而且时长摆在那,总归还是给了我挺大的信心。
反正也是没做什么休息就继续第三轮的面试了,原本是视频面试的,结果第三位面试官迟到了10分钟还没进视频面试房间,我都掏出手机准备给Hr打电话了,大概16:12分左右他才打电话过来变成了电话面试。上来也是先来个自我介绍,之后聊到说我们是自研引擎,让我介绍了下团员人员数,以及我具体扮演什么样的一个角色以及团队分工。发现人员数不对之后就问我是拿现成的引擎还是纯自研,我也说了拿的Urho3D,可能Ogre比较出名,它是在借鉴了很多Ogre代码并进行简化和优化。也问了模型动画相关,因为面试官玩过自走棋,所以问了游戏大致模型的面数和DrawCall数量,以及模型贴图相关,我大概描述了下模型大概在2K-4K面左右,Drawcall的话,对于那种有坐骑骨骼数稍微多一些的话会分id就需要占到两个DC,剩下的一个DC,它们的武器和贴图都在一张里。然后模型没有normal和specular,因为镜头离得比较远。还问了一个比较尴尬的问题,问了游戏现在什么进度,我说了大概暑假六月份左右他还有些不可思议。后来又问了画质画风与多多以及Dota霸业比,我也只能尴尬地说我认为因为经费原因自然是没有他们好,而且因为收费模式是靠皮肤,而白嫖党比较多,自然营收不是特别好。
同样也问了UI相关优化,问到了具体的优化指标,因为我对这些数据并不感兴趣,当时也只是简单测试并记录。所以说了公司有记录但我自己是真的记不清了,然后他就问了我大概优化到什么样子,例如一倍或者怎么样一个指标都行,我就说了优化UI遍历那个我确实记得优化了有一倍,然后OverDraw那种因为游戏里大部分是透明物体,所以基本没有什么优化,像大厅遮挡的东西比较多,优化比较明显从原来20帧优化到了60帧。
因为我说了,有之前有自学了UE4蓝图,以及最近在学UE4 C++编程。所以他就问我UE4和UE3在使用方面,从美术的角度出发UE4有哪些提升。我当时想到UE4的构造脚本,对于UE3来说的话,要实现一个自定义的Actor可能就需要程序去写一个,而UE4可以美术自己实现。以及蓝图可以加速美术和脚本更快的去孵化产品,因为它的门槛比较低。但缺点就是蓝图的性能比较差。因为我只知道它这一个缺点,然后面试官补充到,因为节点各种连接可能导致最好看起来比较乱,可读性较差,所以我也补充到,因为美术毕竟不是程序员,缺乏一些封装方面的经验,因为蓝图一些过程可以封装到函数里
最后问了我贴花相关的完了之后,画风一转就让我说说平常有啥爱好。突然就给我整懵了,我还问了下说的是非工作学习方面的那种业余爱好,类似唱歌那种吗。然后就说了自己健身瘦了十几斤有保持运动的励志故事,说了唱歌有KTV水平以及爱打排球可惜工作之后没有什么机会和合适的环境可以打了。之后就问我玩的游戏,以及我玩的一些游戏类型。最后问到了对腾讯工作室的了解,以及我有什么倾向想做的游戏类型,说他们内边类型比较多看哪个游戏类型适合我,我其实内心有点慌的,意思是觉得我不合适想推给其他组还是单纯地问问看?反正我是说了,每个做游戏的都想哪天做独立游戏,可惜我没有策划的能力,但我想的是万一哪一天真想到要做啥了,不至于被技术限制,所以目前来说我是不挑的只要是一个没有接触的游戏类型我都能接受。最后还问了我之前的薪资,也是如实说了,结果他说他只是问问,最终还是Hr决定的薪资。最终也是照例提问环节,我补充问了下我如何得知我最终的面试结果,他说会跟前两个面试官商量,最终决定我过没过,然后很快会让Hr通知我。
总之呢,虽然最后面试官整体问的没有第二位面试官细,而且气氛相比来说轻松不少,但多少有些细思极恐,但愿是我多心吧。反正我是觉得这三轮面试我表现得都算OK,基本发挥出了我该有的水平,也基本都撕得有半个多小时,所以大概率是没问题吧。也庆幸的是最终小抄没用上,事实上提前练习了下,发现看小抄一个是速度慢,一个是不自然。实际面试基本没时间思考,都得秒答。所以最好还是别学我,还是多巩固知识。最后也不得不吐槽,我终于再不用担心受怕了,从投简历那天开始就没怎么睡好觉。因为我都是早上4点到6点睡觉,早上有点风吹草动就会醒来,主要是怕随时来电话。而今天,长达一个月的备战终于结束了。
不幸的是,整个面试流程,没有手撕代码,没有数据结构,没有网络,没有操作系统,很干,啥都没有,基本上问的是我不需要准备就已经会了的东西。所以慎重是真的慎重,惨是真的惨。所以惨痛的教训告诉我,社招和校招是不一样的,我觉的社招比校招简单多了。而且啊,面试最重要的还是巩固 简历上的知识,需要做到完全了解,不要瞎J8乱写
周日中午12点收到了短信,说面试结果为:“进入评估!招聘经理已在为您安排下一步流程。恭喜!离加入鹅厂又近一步了哦^_^”。我去知乎上查了,很多人都不知道这个啥意思,但我觉得看后面那句恭喜应该不是坏事,算是过了技术面了。
周一的时候中午看到招聘经理加了我微信,通知接下来将会收到Hr电话,叫我好好准备。我也问了面试时间以及需要准备什么,她也很Nice地说,时间不固定又是跟之前一样完全随机。要准备的话,就是准备好离职理由和职业规划,以及提醒我说话要客气。我估计是很恶心的压力面了,所以我上知乎上查了下,需要要提前准备以下东西。我建议学我一样,把每个问题的回答用txt写下来,因为是电话面试,所以可以看看,而且提前写下来的话,脑子里也有点印象。还有一点不知道有没有用,我以前接电话都比较随意,上来都是直接“喂”,但是现在已经知道是腾讯打来的电话了(因为平时没人打我电话,加上腾讯打进来的电话会有来电显示标记是腾讯),所以改成“喂,你好”应该会更加亲切和礼貌。
1、离职理由
2、优缺点各准备3个
3、进入腾讯后5年内的职业规划,
4、薪资要求
5、准备一些性格去特质去规避下面切忌的几个问题,让Hr感受到你一颗渴望稳定,以及有希望以后可以带领团队的心
切忌以下几点:
1、控制自己的情绪,如果是压力面的话,肯定会说一些比较难听的话
2、即使有创业的心,也最好不要主动提创业的事,你所表现的性格也尽量不要跟喜欢冒险的事有关,尽可能表现出一些希望稳定的特质,因为Hr希望的是稳定不会动不动离职的人。哪怕Hr问起,也一定不能说自己想创业
3、也不要说身为游戏人,想做一款独立游戏,这么说其实跟想创业没区别,哪怕是用自己业余时间,也是可能有影响工作的因素在里面
周三的时候Hr打电话来让我准备周五早上11点进行复试,忘记问到底是Hr面试还是技术面试了,所以又重新准备了一次技术面相关的东西。周五早上11点收到Hr的电话,整个流程没我想象的那么恐怖,Hr很Nice,全程有说有笑,总之就是很舒服。也没挖什么坑,然后也没提太多我之前假设的那么多问题。最后也说了对我挺满意的,大概问了以下这些问题
1、之前几轮面试觉得自己表现如何
2、离职原因
3、之前团队的组成,主要负责的东西以及带过多少手下(估计是看我当过项目负责人)
4、职业规划
5、怎么看待加班
6、之前在上海那边的时候像附近也有网易或其他的,为什么没有考虑去这些大厂(估计一方面是好奇,一方面是考察稳定性吧)
7、平时有什么兴趣爱好,以及有没玩游戏(兴趣爱好估计是看人是不是够积极,估计腾讯也不希望你是个只会打游戏和工作的人,然后游戏的话随意吧,我反正实际情况是没什么时间玩,所以是按照沉迷工作的情况去回答的)
8、之前的薪资,以及期望
9、之前工作需要交接多久,因为我已经辞职了,所以可以立马到岗
10、有没有直系亲属在腾讯工作,有没重大疾病史
然后我也问了Hr一些问题,以下差不多是原话,“因为面试得有1个月了,想问下接下来还有多少面。以及我知道腾讯内部有分职级,然后我在知乎上看到貌似还需要参加通道委员会的面试,我想问下像我这种情况需不需要参加这个面试。”反正我大致的意图也是想问清楚还需不需要面试,以及打听自己职级的事。然后Hr说不需要再面试了,之后会去跟之前的面试官讨论定级相关的事,之后会给我答复。然后问了我微信
微信上给我的答复是给我定了3-1,其实有点意料之中,也有点意料之外。意料之中是因为我确实工作年限摆在那,因为之前看过知乎,貌似差不多内部也是快的话3年到3-1,因为我对自己蛮有自信的一直都是领先周围同事这么个状态,所以倒觉得蛮符合我的预期。然后3-2不知道是不是要5年,而且我看3-2的工资蛮高的,我一下也不可能涨薪这么多,所以3-1应该是理论上我目前综合来看能拿的最高的职级了。然后意料之外是没有通道委员会面试,可能因为之前几轮技术面试没有被问倒的缘故吧。因为我了解过通道委员会会深挖简历里的内容,如果能答得上来应该就能顺利定级。所以我想应该是我之前几轮的面试表现评分比较高,而且面试官比较牛逼?不过总的来说还算挺开心的,拿到3-1也算证明了自己的实力,因为我听一个大佬说过3-1已经算硬通货了,外面公司就不会随便给工资了。知乎上说2-3升3-1是个大坎,听说从毕业入职到3-1快的话两年,一般3到4年,也有很多人卡在2-3好几年。不过由于没有给我通道面,而且没有面试我简历以外的知识,所以我并不清楚我现在是否具备了3-2以上的知识水平,这点比较遗憾。
之后就是给我发了封邮件,让我上传之前公司的薪资证明,这个我让之前公司开给我了。然后还附上了手机App上银行流水记录截屏,描述了年薪组成。我发了薪资证明之后就没然后了,我以为是腾讯直接定了我的薪资,没跟我说,直接去审批了。
然后等到下周四,我去问了下Hr情况,结果他说最近比较忙,明天再电话联系我,跟我做最后的薪资确认。所以我推测这段时间应该是根据我的薪资以及之前面试的表现,去跟其他人讨论应该给我一个怎样的薪资。到了周五,终于也是跟我确认了最后的薪资。可怜的我完全没有议价的权利,直接拉满涨了30%,但是没有我上家公司离职时挽留给的多啊。不过谁叫人家是腾讯呢,莫得办法呀,不过想想腾讯这个环境去抵消这个差价其实是挺值的。总归现在才开始offer的审批流程,然后也是问了下收到正式offer的时间,他给我的答复是下周三,并且说了背调和offer的审批流程会同时进行。因为有前车之鉴,我也给他打了预防针如果下周末没收到一定会再联系他。
周一的时候收到了背调的邮件,主要是填写个人资料、学历以及最近两段工作经历。每段工作经历需要填写公司名、入职离职时间、职位、上级联系方式以及一个同事联系方式、是否签了竞业协议、离职原因。需要上传身份证正反面,毕业证书,不戴眼镜自拍照和电子签名。
周二收到正式offer邮件,附件有正式offer的pdf,pdf最下方有“接受本offer”和“拒绝本offer”两个按钮,说实话真的好想都点一遍。可是我点了接受按钮之后,还是不敢点拒绝按钮,怕作大死。反正点了接受按钮之后会自动打开浏览器,然后进到一个很简陋的网页,中间就显示一行红字“您已确认接受offer”。接着就会立马收到“腾讯社招新员工入职准备”的邮件,只是说让你提前准备好相关证件和照片,5~10天后会收到“腾讯新员工入职指引”的邮件,需要你到时上传身份证正反面、特殊身份证件、招商银行卡、毕业证、学位证、工作地社保卡、工作地公积金卡、补充公积金卡。然后还告诉你3天内去拍好高宽比102:100的白底工卡照,用来到时入职时做工卡。
周五收到Hr电话,让我上传离职证明或者社保记录或者公积金记录,反正就是让我证明我在这两家公司。以及告诉我有一个同事背调公司没联系上,让我约个时间。然后我联系了同事确认了晚上7点。结果晚上快7点的时候我微信联系这个同事,竟然联系不上。半个小时后他回复我说吃饭没带手机,错过了电话,打回去也没人听。当时我就无语了,马上写邮件跟Hr表示抱歉。刚写完就发过去收到这个同事电话,说跟背调公司联系上了。因此我又写了一份信给Hr。。。
隔了一个周末,周一的时候收到“腾讯新员工入职指引”的邮件,看知乎说到这一步貌似就等于背调通过了。需要上传上面提到的一些资料。除此之外还要你填写英文名,要准备两个因为腾讯要求在内部是唯一的。然后还要你填写两个入职时间,腾讯会根据你给的入职时间安排入职,至于为什么要填两个估计是万一有其他情况作为备选吧。只能周一、周三、周五安排入职,并且我记得不能是月底最后三天。腾讯还有一个比较福利的安排,就是可以勾选申请中转住宿安排,就是如果你的上一段工作的地方跟腾讯工作的地方不在同一个地方(记不太清楚是省还是市了),腾讯可以安排20天的免费中转酒店住宿。这也是给我熟悉路线和找房子提供了很好的缓冲期。酒店的话Hr会提前帮你定好,入住时间是入职时间的前一天。一般的话是标间,不过由于疫情期间就标间就只住一人,爽到。
填写完毕后几小时就收到“新员工入职信息审核通过邮件提醒”,表示你入职指引填的资料没问题。紧接着还收到了“无接触 腾讯E入职提醒”,因为疫情期间为了减少不必要的接触,就让我们网上办理入职手续,邮件还提到说远程办公的事情,一开始我也以为又得呆在家了。我还特意回复邮件问是否到时要远程办公,不知道是否我描述得有问题,HR回复邮件说的话跟没说一样,让我仔细看邮件里的内容,但邮件并没有指明说让我去深圳啊日。过了两天收到Hr电话,给我说酒店的事情,所以应该只是说办理入职是网上办理,工作还是得到岗。只不过让我比较懵逼的是,我上网查了腾讯在深圳南山区有很多办公楼,然后邮件也没告诉我我的实际工作地点在哪,导致我没办法提早去查路线准备租房的事情。
入职前一天到深圳之后,收到短信让我明天早上网上签劳动合同。总之4月1号正式入职那天签电子合同的时候感觉很不真实,自己一个人在酒店把劳动合同给签了,签完一点兴奋的感觉都没有。下午收到企业帐号和密码,以及导师秘书的联系方式,也是自己去联系导师问办公地点,以及让我可以先干啥。因为导师比较忙,说第二天下午会通知我。第二天被拉进社招群里,参加线上的社招培训。下午收到导师联系,让我熟悉一下新人需知的工作流程,完成下作业。这一天企业帐号会生效,需要看防疫需知的视频,看完之后才能生成电子通行证。由于视频里的政策和实际实行的政策不一致,以至于原本不需要隔离的我看了视频之后,发现非工作地都要隔离14天,就把问卷改成了需要隔离。结果第三天电子通行证更新的时候,显示不能去办公地点上班。如果不是社招群里有小姐姐发现跟我同家酒店私聊我,我估计真的就隔离14天了,所以立马把问卷改成不需要隔离。中间隔了3天清明假期,等到结束那天也就是4月7号,正式去领取工卡,问了办公楼之后自己就进去了。自己找到位置之后,就看见工位上放了4箱未拆封的显示器主机之类的设备,所以第一天就在组装设备,搭工作环境的过程中过去了。
现在也算入职两个星期了,总归大厂的福利以及办公环境都比较不错,即使加班大家都很认真地工作。比较失望的地方是,感觉沟通成本太高了,从收到入职指引开始,就感觉体验就很差。首先是没人告知背调是否通过,然后能不能去工作地工作还是远程办公这些说得不清不楚,等到收到导师电话自己去问才知道自己的办公地点具体在哪。需不需要隔离也没有明确指示,Hr只是说通行证生成了才能返岗,但通行证需要看视频和填问卷,视频的政策说需要隔离但实际并不需要隔离,问卷又是个自觉填写的东西,我填需要隔离我就不能生成通行证,填不需要就可以。即使返岗了,也会遇到各种各样的沟通问题,不一定会有人带着你熟悉各项东西,把你当新人。不会有人教你晚上10点怎么打车报销,权限怎么申请,工作上遇到问题应该找谁。只能靠自己找文档,主动去社交和请教,各种信息不对称真的搞得人压力很大。
当然我不是收到Hr通知之后才开始复习的,我是自从去年离职以前就开始复习了。而且我说了,因为我没有社招面试经验,所以对面试考察的范围一无所知,所以只能上网查面经了,也因此走上了一条不归路。大部分都是校招面经的居多,抱着有杀错不放过的觉悟,我开始复习以下常见考点,前面也证明我太你妈慎重勇者了,我经历了长达两个月的复习时间,甚至将我的QQ签名改成了Ready Perfectly! 到了面试前一天,我已经一点要复习的东西都没有了,一滴都没有了。虽然面试过程中撕的都是我简历上的东西,但是我不排除是我简历比较能打的可能性,所以我不会建议你其他啥都不复习。因为进去之后我确实也有听到别人面非简历上的东西,只能说看面试官习惯了。
有一点需要强调的是,如果你看了上面我技术面的东西,这些如果你没这方面的工作经历,面试官是肯定不会问的,也就是说我的技术面经没有可借鉴性。他只会问你工作经历中的东西。而如果你的工作经历并不突出的话,就会问你下面一些基础,如果你U3D或者UE有这方面使用经验的话,可能也会问你相关方面的东西,这些都是说不准的。 那么总归先分享一下,哪怕给校招和社招的同学涨涨见识也行
1、C++
2、图形
3、数据结构和STL,Top k问题,排序算法,手撕代码
4、设计模式
5、网络相关,三次握手、四次挥手、TCP和UDP、输入网址问题、长短连接、状态同步帧同步
6、操作系统,进程和线程,进程线程通信,死锁相关,进程调度,分段分页,虚拟内存
以下是我觉得特别不错的知识归纳,咱也根据上面那些一条条来过一遍
https://www.jianshu.com/p/0c02c2622d1d 这位同学获得最杰出贡献奖,写了不少面经,以及基本涵盖了全方面的总结
https://me.csdn.net/u012999985 这位博主的许多博文还是不错的,可以看他的《史上最全的C++/游戏开发问题总结》,以及《游戏开发入门》,游戏开发入门的话他其实是看课程做的归纳,我没时间看视频直接看归纳对我没接触过的内容进行查漏补缺。
顺便推荐下Effective C++这本书,第一篇博客作者推荐的,如果只是面试的话,不建议看,因为确实比较花时间,而且博客作者大致把常考的内容也都列出来了。但是对于有编程洁癖,想实现一些编程之美,或者对于一些设定模棱两可只知道要这么做却不知道怎么做的同学可以看这本书
也建议买一本《深入应用C++11》这本书,面试官很热衷于考察里面的新特性,例如auto、lambda、右值、function、智能指针等。
建议掌握泛型编程,至少掌握简单的模版和模版特化偏特化,应该就足够应付面试,以及至少掌握这些也对编程技术有一定的提高。
这部分是游戏客户端、以及引擎相关的重中之重。而据我了解,大部分的游戏客户端人员,只懂得游戏引擎API的调用,对底层图形渲染知识完全不知,这是很致命的。如果没有这方面基础的话,基本只是个会用API的C++程序员,我推荐从最基础的书籍开始看起
我的启蒙书是《DirectX 9 0 3D游戏开发编程基础》,也称为红龙书,整本书上手门槛较低,而且是基础中的基础,这本书整本的知识点如果都没法掌握的话,你可能就得重新考虑自己适不适合这条路了。如果你稍微了解的话,应该知道已经有更高级的版本DX10、DX11、DX12了。但我依旧推荐这本,原因是我希望你巩固好里面的理论知识,剩下的只是API的不同。你更重要的是要学习图形API一般在处理哪些事
如果你已经掌握了上面这本书,可以试着看这位博主的博文https://blog.csdn.net/qq_29523119/article/list/ 掌握DX11相关编程。当然有的同学会去考虑说到底选择DX11还是OpenGL,甚至还有Metal和Vulkan。依个人愚见的话,总归DX11不是个跨平台的图形库,基本只能在微软一家的平台设备上支持,如果你觉得想做3A游戏,有本事研究得特别透彻然后还有幸找到端游团队的话可以学DX11。而Opengl的话,我个人是觉得性价比最高的,毕竟目前来说的话它各个平台通吃。当然你会说他没DX屌,废话,你DX倒是在手机上跑给我看啊。同样Metal在苹果性能上可能比GL好,除非有要做iOS的针对性优化,不然的话上手Metal难度肯定要比GL大。至于Vulkan,我持观望态度,听说是比Opengl要好并且跨平台(不支持苹果),不过肯定也有一定学习和试错成本,但毕竟我没有用过,可能之后需要找机会研究下。所以我个人的观点是先从Opengl下手,毕竟现在手游是霸主。至于如何学Opengl,我确实没有太好的建议,只听说过有本书叫红宝书是入门书,但我确实没看过,不敢妄加评价。因为我是工作上用了Urho3D这个引擎,它的图形API是已经搭建好的,本身我负责引擎相关工作中就会去接触Opengl引擎相关东西,所以渐渐就熟了。虽然大部分时间其实都在写DX和Opengl的Shader,也就是HLSL和GLSL。这里我顶多只能推荐这个专栏,不过它不是入门级别的,只能算是进阶 https://zhuanlan.zhihu.com/c_1083379413340438528
等到你大致掌握了图形API用法之后,差不多就需要巩固你的数学知识了,我推荐《3D数学基础:图形与游戏开发》,再进阶的话是《3D游戏与计算机图形学中的数学方法》,这本书我觉得公式推导得太深,反而容易把人看傻掉,所以后面那本书好书是好书但我没有前面那本书看得多。
当然,等你这些书看完之后,你会发现你依旧做不出一个工业级别的引擎。主要原因是这些书都偏基础向,对于很多技术向的东西其实只是简单提了下,并没有介绍其代码的实现。例如视锥剔除、八叉树、后期处理、前向渲染延迟渲染、光照模型、阴影、模型动画等书里基本都一笔带过。而不幸的是,这些知识很可能面试游戏程序相关岗位会被提及。我看《DirectX 12 3D 游戏开发实战》这本书的目录,有稍微提及我说到的这些知识点,但我没看过这本书,我不确定它是否符合我心里对于“详细”二字的定位。我算是比较幸运的人了,我可以很坦白的讲,Urho3D这个引擎真的是一个特别入门向的一个游戏引擎,恰好他涵盖了我上面提及的所有东西,代码我估计全部加起来顶多也就几万行吧,全部编译完也就两三分钟,相比UE4屎山一样的代码我觉得是一个相当神圣的存在,毕竟我第一次编译UE4花了一整晚。
第一篇博客提到的图形基础,我只有光线追踪是确实没接触过,貌似依赖硬件,好像是最近才兴起的,因为手游估计用不到,所以我直接放弃了。然后Static Batch和Dynamic Batch貌似是Unity里面的?不确定,没这部分的概念,所以觉得面试不会提及也没管。其他的基本是游戏引擎通用的技术了,建议都掌握
我推荐 https://blog.csdn.net/weixin_37027464/article/details/82818337 去看光照模型,也可以看我博客写的光照模型,我是借鉴了他的,再加上Urho3D里代码的实现
虽然我写了前向渲染和延迟渲染相关的博客,但是回过头来看的话,确实只是写给我自己看的,也没有代码。所以也不推荐看我的,当然如果你感兴趣看一下也无妨。
投影矩阵我建议看我写的博客以及https://www.cnblogs.com/leixinyue/p/11166135.html ,因为我博客里写的是DX投影矩阵的推导,而这篇是OpenGL的,稍微有点不一样。
https://blog.csdn.net/zhaotianyu950323/article/details/79955805 图形学面试相关知识小结
https://www.jianshu.com/p/b8881c724621 渲染流水线
https://learnopengl-cn.github.io/07%20PBR/01%20Theory/ PBR相关,这年头是个面试官都喜欢拿这个来问。虽然我一直觉得知道理论没什么屌用,你又不可能去改它的光照模型,而且效果也都是美术在调,所以我个人觉得知道的意义不大。但是,考试它考就由不得你。进到这个网址之后,你先得把整套BRDF学完,然后点上面的目录-PBR-IBL部分也给学完。个人觉得这是所有PBR资料里说得最农民的一个了,至少我一句句看,最后全看懂了。IBL我扫得太快,发现根本看不明白,后来是实在没办法收到后天要面试了,硬着头皮一句句看,给看明白了,所以血的教训就是不要跳着看。另外顺便提一下IBL中的LUT贴图,UE4为了省一张贴图,改成一个结果近似的算法替代了。
我顺便补充一下其他图形相关知识,虽然不一定会考,会考的我会稍微提醒一下,你们可以看着了解下。
一个是我博客那篇《图形相关笔记》,介绍了阴影相关实现以及容易遇到的一些问题,这篇文章最后的法线空间变换,它说的是切线空间和TBN矩阵是怎么回事,以及法线为什么要乘以逆矩阵的转置。因为我是看了知乎一个投游戏引擎岗位的大佬面经提到阴影相关算法以及法线相关问题,所以特地去做的总结
去了解一些常用的后期技术,所谓后期,就是在整个渲染流程结束之后,对整个屏幕的渲染结果进行一个重新计算,使其呈现一些其他效果。常用的一些后期是FXAA(抗锯齿),SSAO(环境遮蔽,计算量大,手机一般不会用),Bloom(光溢出),Blur(模糊,通常用高斯模糊),Motion Blur(运动模糊),DOF(景深),ColorCorrection(伽马矫正),Tonemap(色调映射)等。这里边我个人觉得如果面试的话,可能上面加粗的考察的可能性大一点,主要它们也是比较简单的后期。运动模糊和ToneMap我只是知道,但我没看过代码,不好评价,FXAA代码量貌似挺多的,估计不太可能考察。
有算法经验的人一定接触过线段树,它是一种二叉树,而在3D游戏常用的是八叉树,多了两维,道理差不多可以学习下,如果是引擎研发岗的话可能会问吧。
了解Shader里面,根据屏幕像素的位置和深度信息,得到对应的世界坐标。以及CPU中,如果根据屏幕坐标,得到射线的起点和方向,主要用于射线检测。因为我简历上写了我实现了战争迷雾,因为战争迷雾是屏幕坐标转世界坐标再去采样贴图的的,然后面试官问了我这么个问题。
《阴影渲染》,它讲的是各种灯大致的实现原理
《广告牌技术》,这个如果搞粒子系统或优化的同学可能会用到
《伽马矫正》,投游戏引擎岗位的大佬面经也提到了,简单说下就是Shader里光照部分要将贴图颜色转到线性空间进行混合,最后处理回伽马空间才是物理正确的。没处理过的贴图是伽马空间,SRGB格式贴图是CPU通过图形API转到线性空间,转到线性空间的做法就是将贴图颜色进行pow(color,2.2)处理,然后混合完之后,再对混合完的颜色pow(color,1.0/2.2)
《骨骼蒙皮动画》,就是骨骼模型是怎么动起来的,因为没写什么代码,所以肯定说得不咋的
《描边》,在我心理它的地位其实蛮高的,主要是当我懂了一些图形知识时,我依旧不知道怎么去实现它。后来是因为有次放3天假期,硬是查资料给弄懂了。怎么说呢,在UE4因为有材质编辑器,所以网上描边的材质资源烂大街了。我也是看了UE4的材质连法才学会的。客观地说,懂了之后它其实挺简单的,我想把它挂简历里多少能唬人吧。
《行矩阵和列矩阵》,这个主要讲的是DX和OpenGL内存里面矩阵数据存放的方式。引申出来的话,我觉得身为一个客户端开发工程师你需要了解以下几点,因为我花了很长时间才搞明白,但我不敢保证说我理解的一定对,所以我不会告诉你我理解的结果,万一错了就误导人了
1、最基本的要分得清是行矩阵还是列矩阵,
2、矩阵里哪一部分是位置,哪一部分是旋转,怎么把3X3旋转那部分分离出缩放和旋转两部分。
3、矩阵乘以向量的话,应该左乘还是右乘,向量的w分量如果是0或者1与矩阵相乘,是一个什么样的结果和概念
4、假设有3个矩阵,假设要构造一个WorldTransform,你根据位置、旋转、缩放,分别构造出了3个矩阵,你应该使用怎样的乘法顺序才能构造出WorldTransform
5、矩阵数据从CPU传到Shader里之后,Shader里的矩阵它的GPUM[0][1]到底对应的是CPU的CPUM[0][1]还是CPUM[1][0]
6、Shader里面左乘和右乘的区别,向量乘矩阵在Shader里都是编译得过的,而且分别代表了不同的结果。甚至HLSL里还有Mul方法
7、CPU里面在进行坐标系转换时,什么时候该用逆矩阵
不用多说,我看了很多篇面经,基本都在手撕红黑树,当然也有例外类似B+树,B树,平衡树
因为红黑树比较难,所以我特地找了篇最好的https://www.jianshu.com/p/e136ec79235c
平衡树比较简单,看下代码就会了,B+树和B树我估计是服务器的人考察的比较多,貌似是数据库用的算法,我只是简单记了下它的操作。
STL要会的就比较多了,栈、队列、堆、map、set、vector、list、unordered_map、unordered_set这些底层实现都要知道。因为我是搞算法的对它们的原理 信手拈来,所以我花的时间比较少,但我可以简单提下重点。堆的话是优先队列也就是priority_queue,有一些数据流求中位数或者TopK问题会需要用到堆排序。map和set是红黑树没啥好讲的。vector考察得最多,例如扩容、拷贝数据、删除导致迭代器失效等考点,也会与list一起考察存取删除的复杂度。unordered_map、unordered_set是哈希表,会和红黑树一起比较,红黑树又会和平衡树经行比较。
TopK问题的话,我看了几篇文章,不外乎以下几种技法
1、排序,复杂度平均最快也得O(nlogn)
2、利用快排的特性进行划分,如果不需要保证TopK是有序的话,它的复杂度就只要O(n)
3、利用小根堆的特性,只维护大小为K的堆,堆插入删除复杂度是O(logK),如果运气好经常有元素比堆顶小的话,就只需要O(1)的时间去比较就可以筛掉数据,运行不好就会经常插入删除
4、拓展出去的话,还有大数据TopK,基本都是用的类似分布式的做法,分成若干个桶,一个个桶进行处理,每个桶得出TopK,再依次将每个桶的TopK用排序的方式或者堆的方式整合到一起,最后获取到最终的TopK
排序算法,没啥好说的,要能手写快排和归并排序,以及知道每种排序的复杂度和稳定性
// 快排
void quick_sort(std::vector& v, int start, int end)
{
if (start >= end) return;
int i = start;
int j = end;
int num = v[i];
while (i < j)
{
while (i < j&&v[j] >= num) --j;
if (i < j) v[i] = v[j];
while (i < j&&v[i] >= num) ++i;
if (i < j) v[j] = v[i];
}
v[i] = num;
quick_sort(v, start, i - 1);
quick_sort(v, i + 1, end);
}
// 归并
void Merge(vector& v, vector&temp, int start, int mid, int end)
{
int p = start;
int q = mid + 1;
int i = 0;
while (p <= mid && q <= end)
{
if (v[p] <= v[q]) temp[i++] = v[p++];
else temp[i++] = v[q++];
}
while (p <= mid) temp[i++] = v[p++];
while (q <= end) temp[i++] = v[q++];
for (int i = start, j = 0; i <= end; ++i, ++j)
{
v[i] = temp[j];
}
}
void Sort2(vector& v, vector&temp, int start, int end)
{
if (start >= end) return;
int mid = (start + end) >> 1;
Sort2(v, temp, start, mid);
Sort2(v, temp, mid + 1, end);
Merge(v, temp, start, mid, end);
}
void Sort(vector& v)
{
vector temp;
temp.resize(v.size());
Sort2(v, temp, 0, v.size()-1);
}
再次炫耀,因为我大学是搞ACM程序竞赛的,特别是DP题是我的强项,所以现在很多竞赛数据结构和算法都忘了,就DP的解题思路还留着可以吃老本。即使是这样,我依然慎重地把剑指offer、LeetCode网站右侧3个免费题库给刷了一遍,还开通了会员打算把腾讯题库全刷一遍,结果刷了个几十题实在没时间和精力了,做了10场左右的模拟面试100%通过率之后就没再刷题了。
leetCode大概这些题目我觉得是有卡到我,因为我比较直脑筋,不是特别擅长YY题,所以对于那些乍一看出不来思路的就基本没戏了。我的能力是银牌水平,大部分中等是没问题的,能刚部分困难题。以下是leetCode的题目序号4、11、44、46(我看有面经要求5-7分钟出代码)、72、84(我第一份工作面试的时候出了它的进阶版85题)、134、138、141、142、155、189(不使用额外空间)、218、237、239、260、295、315(我是用的树状数组解的,只是Mark下有归并排序的解法,不过归并一般人想不到所以实际意义不是很大)、338、384、395、421、560(没有卡到我,只是单纯Mark一下是好题)、887(他恶心就恶心在用正常的DP解会超时,得换个思路,而且题解里有人面试提到了这道题的变种,知乎上也有人说面到了这题)
看了一份面经,有提到一道推导题,因为不是我强项,我尝试思考了一下之后,发现写不来转移方程就上网查了https://baike.baidu.com/item/%E5%85%A8%E9%94%99%E4%BD%8D%E6%8E%92%E5%88%97 ,面经上是说给N个球和N个桶,它们分别标有1-N的序号,求每个球放进不同编号的桶,总共有多少种放法。
https://www.nowcoder.com/ta/coding-interviews
https://leetcode-cn.com/problemset/top/
https://leetcode-cn.com/problemset/50/
https://leetcode-cn.com/problemset/hot-100/
这方面的书挺多的,我看的是《设计模式与游戏完美开发》,我知道常用的是单例模式、工厂模式(用于反射,建议了解下反射机制,可能会考)、外观模式(各种子系统)、原型模式(也就是Prefab,类似UE4的蓝图Actor,一个原型生成多个实例)、迭代器模式、组合模式(component组件就是这种模式)、观察者模式。当然还有其他很多模式,但由于可能设计模式掌握得不是特别深入,所以可能即使用到了也不知道是哪个。
https://zhuanlan.zhihu.com/p/85557012?utm_source=qq&utm_medium=social&utm_oi=696471088976105472 三次握手,四次挥手
https://blog.csdn.net/xiaobaixiongxiong/article/details/86570740 TCP和UDP的优缺点
https://www.cnblogs.com/wupeixuan/p/8747918.html 当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
https://blog.csdn.net/qq_22238021/article/details/80279001 网络模型
https://blog.csdn.net/qq_41431406/article/details/97926927 TCP拥塞控制
https://blog.csdn.net/yao5hed/article/details/81046945 TCP滑动窗口
https://gameinstitute.qq.com/community/detail/116978 王者荣耀的帧同步,看到有面经提到王者荣耀是用什么同步了
这部分真的是知识盲区,平常开发哪会遇到这些屌问题,所以也是花了好些时间去背
https://blog.csdn.net/xiongluo0628/article/details/81461053
https://blog.csdn.net/youngchang06hpu/article/details/8009947
https://www.jianshu.com/p/baf3a13c47db 虚拟内存
https://www.cnblogs.com/katachi/p/10787563.html https://blog.csdn.net/qq_37924084/article/details/78360003段表和页表