游戏客户端面经及经历分享
前言
我的秋招结束了,非常艰难,一度以为自己找不到工作了,感觉经历了一段至暗期。期间牛客的帖子帮助很大,所以秋招结束后也想分享一些面经、建议、经历、和心路历程, 希望能够帮助到一些想加入游戏行业的同学。我投递的几乎都是游戏客户端开发岗位,本文也主要围绕这个岗位进行分享。
个人简介
简单介绍一下背景:25届硕士,毕业于美国某名牌大学,计算机专业,游戏开发方向。学校是挺好的,同届同学很多也早早加入游戏大厂,而同时间我却挣扎了很久。主要是参加了25届的春招的一些补录和26届的秋招,所以今年秋招有一部分被挂掉有可能是由于毕业时间。至于为什么晚了一年找工作,只能说纯是自己太昏头,需要以我为戒。同时如果有类似背景的同学也可以参考我的经历。
简历上两段游戏实习经历,一段国内某中厂UE相关,也就是整个小型demo;一段国外小工作室Unity VR项目,非常小的团队。两段经历的含金量都不高。项目经历包括一个毕业项目和两个课程项目,含金量也很一般。总之,毕业院校还不错但经历非常普通。
游戏客户端面经
首先直入正题,先分享一些八股和面经
八股
C++
- 多态(静态/动态多态,虚函数,虚表,是什么以及原理)
- 智能指针
- 析构函数(为什么是虚函数、内存泄漏、继承下析构顺序)
以上为C++高频,这几条几乎每场必考
- 内存布局(堆、栈等)
- 指针和引用的区别
- 源代码到可执行文件的流程
- Lamda(是什么、使用时需要注意什么)
- 继承(内存长什么样,有/无虚函数时又长什么样)
- 菱形继承(有什么问题、虚继承、内存长什么样)
- new/malloc区别
- 构造函数(能不能为virtual、继承下调用顺序)
- vector和list的区别(局部性、性能、结构)
- vector扩容机制
- unordered_map/map(底层结构是什么、哈希冲突怎么解决)
- 模板(能不能声明定义分开写)
- static/const用法
- 常量指针、指针常量
其实可能很多没写全的,可以去看一些更全面的资料,附上一些我看过的:
********** (力扣上的书,要会员,有些东西可能有点老,个人觉得还挺全面,高频也很准)
计算机网络
- TCP/UDP
- 三次握手
- 可靠UDP
- 帧同步/状态同步
考得不多但第一条非常高频
操作系统
- 进程/线程(协程有时候会一起问)
- 线程同步(锁、条件变量、原子操作)
- 死锁(是什么,怎么解决)
- 进程同步(几乎不会考)
考的不多但第一条比较高频
图形学
- 渲染管线(最高频)
- 判断点在三角形内(叉积、重心坐标、面积法)
- 抗锯齿(各算法、优劣、有什么问题)
- 透明混合
- 前向/延迟渲染
- 阴影(light map、shadow map原理)
- 碰撞检测优化:BVH/空间划分(八叉树)
- 光线追踪
- 欧拉角/四元数(优劣、差别)
- Early-Z(什么时候会失效)
这个也挺牛的,很多人分享过
算法
- Top-K
- 判断链表是否有环,找到环入口(怎么证明)
- AStar(流程、是否最优)
口撕是这些比较高频,AStar可能是我简历有相关所以这个问的也多
Unity
- C#值类型/引用类型
- AB包(打包注意什么、加载卸载要注意什么、引用计数)
- 合批(静态/动态/UI)
- 装箱/拆箱
- 模板(有什么好处)
- UGUI的理解(底层/怎么用,很少会问)
- Collider/Trigger
- 垃圾回收
- 协程(IEnumerator/Coroutine)
其实很少会问Unity的八股,Unity项目可能会问,但也非常少
UE
- 反射系统(原理、UTH)
- UPROPERTY等宏
- 大地图流式加载
其实也没什么了,引擎相关的知识其实很少问,UE项目有可能会问到反射相关,其余也不深究
也是很多人分享过的很厉害的作者了,其他文章也值得看。虽然面试可能不会直接问,但是能展现出理解我觉得也是优势
面经
分享一些公司的面试中遇到的还记得的提问和经历
巨人
- vector中去重(erase会有什么问题、迭代器)
- 导致游戏卡顿的因素
- 找最短路径用什么算法、数据结构(BFS、FIFO)
- 状态同步
点点
一面:遇到的唯一一家纯问Unity,参考上文
- 装箱/拆箱
- 模板(避免装箱)
- C#值类型/引用类型
- 接口和抽象类的区别
- trigger和collider
- drawcall优化的方法
- 静态/动态合批及条件(动态小物体,不超过300顶点)
- UI合批,合批条件:不能被打断、不能穿插、要一个图集
- AB包(如何设计、打包、加载/卸载、引用计数)
对于我没回答好的问题,面试官会给出解答
二面为策划面
- 项目中的团队合作,如何和不同成员沟通、互动
- 如果同时有几个策划在和你对接,水平可能参差不齐,你如何沟通、整理需求、实现功能
没给反问环节,面完就感觉寄了
Bilibili
UE在研(一面)
- UE反射系统
- C++高频八股(多态、智能指针)
- 有一堆2D坐标,快速找有哪些落在半径为r的圆范围内
- skinning原理
- 哈希冲突
- 垃圾回收机制
- UE的字符串
- UE和Unity的区别
- 渲染管线
- 抗锯齿
感觉答挺好,一面挂
库洛
一面纯八股
- C++高频
- 栈什么情况会爆
- 类大小计算(内存对齐)
- 菱形继承(有什么问题、虚继承、内存布局)
- Lamda(要注意什么)
- AStar流程
- Static
- TCP/UDP
- 口撕:链表找环入口(快慢指针、数学证明)
二面问项目/实习,没什么参考价值
- Unity实习项目的代码结构
- 项目功能实现
二面挂,有点像KPI面
雷火
一面有两轮
第一轮纯做题
- new int()和new int的区别
- 从给出的strcpy代码中找问题
- 排列组合数学题
- 继承例子中构造函数和析构函数的调用顺序
第二轮纯八股
- C++高频
- placement new
- 进程通信
- 大端小端
- Unity垃圾回收机制
- 堆排序
- 判断点是否在三角形内部
- 死锁,线程同步
- 光追原理
- 渲染管线
二面主管面
- 死锁,线程同步
- C#值类型/引用类型
- 进程通信的方式
- C++移动语义
- 简历项目
- 手撕:循环小数找循环节
二面挂,非常看重C++基础和算法,面试官说如果这两方面能对答如流,他们会觉得你很有潜力,如果中等的话,也可以考虑,下等就不好说了。我以为我是中等,但可能别人认为是下等
米哈游(Gameplay方向)
一面纯八股
- C++高频
- i++和++i哪个是左值哪个是右值
- C++四种cast
- 模板(什么时候知道T的具体类型)
- 遍历数组和链表哪个更快(局部性、cache命中、cacheline)
- 哈希表最差情况复杂度,哈希冲突怎么解决
- 线程同步(自旋锁和互斥锁的区别,底层实现)
- 空类占多大内存
- delete是怎么知道要delete多少字节
- 口撕:无序数组找前k小(堆、快速选择、时/空间复杂度)
- 有没有了解过设计模式
- 手撕:单例模式
面试官很友好,面试体验很好,开始时会介绍接下来会问到什么。即使回答不出来,也会做一些引导和提醒,会给你机会对没问到的方面进行补充说明,结果出来的也很快,第二天立马挂。米哈游是出了名的重八股的,会问的比较细,后面什么环节就不知道了。
米哈游(UE5在研)
- C++高频(vptr、虚表)
- 菱形继承(内存中长什么样)
- 射击游戏的一定范围内散射怎么做(就是锥体内找随机偏转方向,找角度)
这次八股问的不深,并且没有手撕。同样第二天立马挂
腾讯(CFMobile)
一面
- 口撕:找到有环链表的入环口,然后反转从头到环口这一段(就是找环口+反转链表、数学证明)
- map的底层是什么,复杂度(红黑树)
- vector扩容
- GPU skinning
- CPU和GPU间的通信
- 类似新战神里演出的无缝切换怎么做的
- 有没有了解过业界的一些新技术
- OOP、数据驱动、对UE的一些框架/设计的看法、ECS(主要是简历有相关才问的)
二面
- Shadowmap原理
- 狙击开镜怎么做的
- 2000个顶点的模型,vertex shader和frag shader各执行多少次(vs逐顶点,fs看分辨率)
- strcmp怎么做的(一个个char对比)有没有更快的方式
其他的都是问了一些简历有关的,面试官对我评价很一般,说是看过我的github,觉得作品完成度不如很多同学,二面挂
腾娱
光环:和平精英组,社招
一面
- C++高频(多态、智能指针)
- new和malloc区别
- 析构时先析构子还是父
- final
- 模板声明写头文件定义写cpp里有什么问题
- TCP/UDP
- 抗锯齿
- UE的EQS是什么,和Navmesh怎么搭配用
- 如果想自己实现EQS的话,要怎么做(框架)
- 如果希望AI只寻找当前楼层的点,防止找到其他楼层(高低差),怎么做
二面
- 简历实习项目相关
- C++17新特性了解过吗
- C++和C#优缺点,有没有什么C#功能是你想移到C++的,或者反过来
- 如果你写的AI功能有性能问题,如何排查
三面
- 项目的难点
- Navmesh问的比较多
- 如果想实现可视化从人物当前位置到指定位置的路线,怎么做;如果中间有障碍物能跳过去呢,怎么做
腾娱是腾讯子公司,说难听点就是内包,光环是给光子工作室做事的。不过面试官都是腾讯正式员工,有三场技术面。
灵犀
一面:UE在研SLG
- ECS是什么,component在内存中的布局
- TCP三次握手
- 判断链表是否有环和找入环口
- 问了一些简历相关
一面挂
腾娱(王者荣耀)
一面
- ECS component更新顺序
- ECS怎么debug
- 找前10最小(Top-K),复杂度
- 父类构造函数调用父类virtual时,具体调用的是哪个函数(父的还是子类重写的)
- C#的array和list区别,linkedlist、stack、map
- 对UGUI的理解
- 还问了一些简历项目相关
英雄
潘神工作室
一面
- C++高频(多态、智能指针)
- 模板原理,性能和虚函数比如何
- 常量指针、指针常量
- 堆和栈区别
- new和malloc区别
- 用迭代器遍历vector的同时用push_back有什么问题
- 判断点是否在三角形内部(叉积)
- C++11特性
- Lamda是什么,捕获怎么用
- 手撕:合并区间
- 多线程中使用share_ptr时,引用计数会怎么更新,会有问题吗
- 法线贴图(法线怎么存的、为什么一般多为蓝色)
有一些问题可能是面试官突发奇想,没有硬性要求要回答出,总体体验不错
二面
- 问了一些简历相关
- 手撕:给一个string找合法DNS(xx.xx.xx.xx,每个xx为0-255)没做好,讲的也不好,花了很长时间
- 喜欢玩什么游戏
腾娱(游戏AI)
一面电话面试
- 内存碎片
- 怎么设计一个内存管理系统避免内存碎片
- ECS相关
二面
- C++高频(智能指针)
- AStar算法
- using怎么用
- Image-based lighting
- 阴影技术
- placement new
- 如何计算一个类大小(内存对齐)
- 一个怪会掉不同稀有度的装备,各有不同概率(0.1白、0.2蓝、0.15橙),如何实现
- 正态分布如何转换为均匀分布
莉莉丝
- UE5 GAS
- GameplayTag怎么用的,有什么好处
- 用GAS实现一个沉默效果怎么做
- GameFeature是什么,如果有依赖关系怎么办
- 项目寻路系统相关
- SIMD原理
主要是基于简历问的,参考价值不高
- C++智能指针(为什么要有weak count)一面挂
途游
Cocos2d项目
一面
- Unity和UE的区别、理解
- TCP/UDP
- 三次握手
- 问了一些项目相关
- 平常喜欢玩什么游戏、玩什么手游
对我反馈还不错,但没后续了
投递情况
有些可能是因为卡毕业时间直接刷掉,也有可能只是因为我不够优秀,但也有一些公司在我毕业时间不匹配的情况下仍发了笔试面试的,供大家参考。
长时间不理人的也当挂了,我没有一个个官网去复查,有些公司也不更新。以下除非明确注明都为26届秋招:
简历挂:鹰角、搜狐畅游、XVERSE元象、三七互娱、完美世界、朝夕光年、盛趣、游卡、华娱游戏、西山居、散爆网络、紫龙游戏、深蓝互动
笔试挂:沐瞳、Funplus、诗悦(不难,感觉做挺好还是挂)、吉比特、吉比特无界计划(笔试形式为24小时作业,做的挺用心的但依旧挂)、快手、友塔游戏(太难了)、掌趣、波克城市、库洛(感觉这次秋招比春招笔试难很多)、网易互娱
一面挂:灵犀、莉莉丝、诗悦(TA方向,客户端笔试就挂了但居然TA捞了,但其实不太对口)、Bilibili、Garena(发了一面通知,预约了但没发会议链接,联系了hr说当周约满了等之后发通知,然后就不了了之了,追问也不回,最神人的一集)、途游、巨人网络、米哈游、腾娱(王者荣耀)
二面挂:点点互动、腾娱(游戏AI方向,反馈还可以但没消息了)、腾讯(CF手游、春招)、网易雷火(春招)、库洛(春招)
接下来就是搞心态的了,有两家是技术面全过并且hr面也结束,处于等待offer的阶段,最终因为各自的理由把我拒了,基本都是拖了一到两周,甚至还得自己追问,已经被遗忘掉了。在此之前一直以为到了hr面就稳了。
个人建议
基于这段时间的求职经历和自己的学习历程分享一些个人拙见,比较浅显,也许可以帮助到一些新手。
简历
关于我自己的简历,模板上就是用的最简洁的纯黑白,没有什么花里胡哨的格式/分区,也是网上最推荐的。内容上除了基本的教育经历、实习经历、项目经历,还加了专业技能(注明熟练程度)、个人简介。我写简历的经验也不丰富,主要是说下我踩过的一些坑。
首先你的简历是为了你投递的岗位量身定制的,在一页纸内尽可能多填岗位相关的内容。以游戏客户端为例,我之前把游戏项目中做过的事全写进去了,包括找素材、配动画、剪预告片、设计、做playtest等,看起来很全面,但问都不知道能问什么,面试官大概率不会关心。需要写上一些技术相关的条目,包括用到的技术栈、算法等,也算是用来引导面试官的提问方向。并且需要熟知写在简历上的每一个点,不要抱着侥幸心理,觉得可能问不到。
关于编简历,有看过网上说可以编实习或者项目经历的,无中生有是有点难度,但我觉得半真半假是可行的。写在简历的东西不一定非要是你真的上手做过的,可以是想过但没做的功能、其他地方看到过相关解决方案、其他成员做的功能等,只要能讲明白怎么做的、涉及到的技术、原理、细节。毕竟面试官只能从问答中了解你的经历,并不会看你的代码。当然,对于这一块需要深度准备一下,只是草率地了解一下是经不起拷打的。有时间甚至可以打开自己的项目自己拓展一下,或者是针对某个功能做个简单demo,这样被问到了也能回答得更自信。这种方法可能更适合个人项目经历,像涉及到比较大型或成熟项目的实习经历可能就不太好编了,每个人情况都不一样。如果是在快要求职或是正在求职的阶段,可以尝试这个方法。如果是还没到求职阶段,那准备时间还长,提前考虑好求职方向,做好眼前的项目就好。
学习
分享一些简单的学习建议,如果你想要加入游戏行业,有充分的时间准备但不知道从何入手,也许能够有所启发。
首先,C++必学,几乎所有游戏公司的笔试和面试都会问到。而且不能只是简单知道语法怎么用,会写点算法题就行了,背后的一些底层原理、功能特性、STL等都要有理解,可以参考网上的C++八股。如果能上手一些C++项目,尤其涉及内存管理、多线程相关的代码则更好。我没做过,这方面不太懂。其实我觉得面试也很少会去问很深度的C++的应用,但我觉得如果你项目里有这方面的经验应该能算一个亮点。
其次是图形学,即使是面客户端也会经常被问到。如果没学过可以从Games101开始,作业也是C++,顺便也一起练了。这个作者的其他系列我认为也蛮有趣的。如果对图形API和游戏引擎开发感兴趣可以看看Cherno的教程。
项目
其实我也没什么经验,但回顾经历,感觉踩了一些可能看起来很理所当然的坑。我的建议就是提前了解想做的岗位是做什么的,考察什么,然后针对性的做这岗位相关的项目,并且要有深度。以我为例,当时游戏设计课就做了一个技术上没什么含金量的游戏,侧重点全放在怎么让画面好看点、玩法完整一点,但我又不是要做策划。还有毕业项目也是加入了一个全是小白的团队,我这水平还当了个leader,做出来的东西也没什么含金量。反观其他同学,制作组都是大佬,最终项目还的奖了。总之人还是得脱离舒适区,和比自己厉害的人多相处,向他们学习,并且这样也有机会获取更多信息。
求职
校招很重要,当然大家都知道,边上学边求职是肯定的,关注多点官号公众号等可以及时收到消息,开了就投就好了,别像我一样时间都搞不明白。可以做个表格记录一下投递了哪些,方便回顾和总结。
之前和两个从业者交流过,我总结出来他们有一个相同的建议,就是培养出一个自己的长板。一位是我实习的老大,他说可以自己挑一个感兴趣或者岗位需要的点作为长板,围绕着进行准备。当时我就想那就图形学,我挺感兴趣。但是以我为例,这样临时抱佛脚其实并没有什么用,只是单纯看看资料背点八股,没有项目支撑并不能怎么突出这是一个长板,而且客户端岗一般也不会那么深入关心你的图形学经验。
还有一位是腾讯的三面面试官。当时是问了我有没有什么研究的比较深的方面,不一定是游戏的,计算机方面的都行。我的确没什么长板,就扯了个之前了解过的gpu-driven pipeline。然后他又问有没有代码相关的经验,并没有,所以回答得很无力。整个面试让我觉得,他重点关注的是大学期间我做了什么,怎么学的,有没有为这个加入这个相关岗位而学习和钻研,做出了什么成果。总而言之,除了八股、算法的基础,还需要有上述提到的有一定钻研深度的亮点和长处。从我这次这个大厂面试经历就可见一斑了,如果你还有时间的话,可以往这方向努力。以这次面试中问到的一个问题为例,他问我喜欢玩ARPG,那对动作系统或者这方面相关的技术有没有了解,然而我并没有什么了解。总而言之,既然喜欢玩游戏,想要成为从业者,就不能只是作为一个消费者看待游戏,可以按自己的兴趣去对某一领域的技术进行深入,甚至可以挑选个课题,做个项目等等。很可惜这些我都没有实现。顺带一提,感觉腾讯不怎么考太深入的八股文。
结语
最终不包括被鸽掉的,我也就只收到两个offer,并且最后还是选择了那个非游戏行业的offer。这篇文章去年十二月份就写了一大半了,本想入职前就分享出来,结果一直拖到现在我都转正了才写完,而且写到后面感觉也有点草率了。以上都为一些个人拙见,理解尚浅,望多多包涵,也希望能够为各位的求职提供一些帮助和避坑。
#春招##秋招##26届求职交流#
查看28道真题和解析