字节跳动游戏研发二面凉经
6.23投递简历
6.30线上笔试
笔试俩小时,包含三种题型:选择、简答和编程,(略了吧就)。
7.5日十一点半接到短信和邮件,通知视频面试,但可供选择的周六和周日两个时间已经全部灰了。第二天再看,可供选择的天数变多了,所以约了周二下午3点。
7.8日晚十点,电话通知修改面试时间,改到了周四上午十一点。
最后也没过,写个面经供大家参考吧:
中午十一点开始一面:时长约40分钟(代码题给了20分钟)
const
和static
的区别,修饰不同变量或函数时的区别,变量的生命周期?看一道代码题,说说第三次运行func()
输出的内容。// // Created by YCIrving on 2019-07-15. // #include <stdio.h> void func() { static int x = 1; // 在对func的三次调用中,x只进行一次初始化 x = x + 1; printf("%d\n", x); // 输出x的值 } int main(int argc, char * const argv[]) { func(); // 输出2 func(); // 输出3 func(); // 输出4 return 0; }
渲染管线了解吗?主要说了渲染流程,谈了谈顶点shader和片段shader
说一种你熟悉的设计模式?目前只接触到了MVC
基本STL的底层实现及复杂度?包括
vector
、map
、list
构造函数和析构函数能否是虚函数?这道题没答好,复习的时候只注意到析构函数可以是虚函数,所以猜测构造函数也可以是虚函数,下来看了答案,只有析构函数可以是虚函数。
聊了聊项目,问了一下项目中地图编辑器有没有想过撤销操作怎么实现?树形结构怎么解析?
代码题:十分简单的dp,类似于上楼梯,原题目是给定一个n,从零开始,每次操作只能加6或者加8,输出到达n的最小操作次数。
面试结束半小时接到电话,下午三点二面:
- 说说C++中的
union
(联合体)?没复习到/(ㄒoㄒ)/~~ - 说说如何理解
(*(void (*)())0)()
的含义吧?我……(后来面试官给了思路,说里面涉及函数的声明和调用、类型转换、函数指针) - 说说C++中,子类继承父类时,子类实例的内存布局?复习时只看了虚函数表的覆盖,只说了这部分
- 看你项目用到了Unity,说说c#中装箱和拆箱?一脸懵逼:)
- 那说说C++和C#是类型安全的语言吗?反问了什么叫类型安全,面试官说就是一个概念,我说不知道。面试官友好地做了解答,可以简单理解为能否直接操作内存,C++中有指针,所以不是类型安全的。
- 那说说unity中的协程(coroutine)吧?我说自己项目之前打算用,但是写法比较复杂,所以用了
while(true)
,然后不断检查状态的方式实现同步 - 那说说Unity中的
yield return
吧,跟你上面的while(true)
有什么区别?我说yield return
没有按照我预期的顺序执行代码,所以也没用。面试官继续友好地给出了答案,说yield return
类似于语法糖,是逐帧进行轮询的,而while (true)
是按照时间片来轮询的,所以yield return
效率上会更好一些。(5和6感觉是自己回答最不好的两题,自己下来反思了一下,回答从侧面反映了自己遇到问题会找不同的方法解决,但没有深挖某种方法,比如效率更高的coroutine,只求能运行,这种态度很不好。) - Lua熟悉吗?我说项目正在用,只了解基本的八种数据类型。面试官说……那算了。
- 看看你逻辑吧?平面上有一个三角形,已知三个顶点的坐标信息,现在给你另外一个点的坐标,怎么判断这个点在不在三角形内部?看我画了半天,面试官提示说点乘叉乘说一下计算方法和几何意义,我说完之后还是不会。面试官说没关系,就是一些技巧方面的判断。
- 说说大顶堆、小顶堆的结构有什么要求?如何删除一个堆顶元素?
- 聊了聊动规的本质,我说是状态的转移,通过避免访问已经访问过的状态来提高效率。然后面试官又以最长递增子序列和切木材的例题让我讲一下转移方程(切木材问题是说不同长度的木材有不同的价值,现在有一条长度为n的木材,问怎么切价值最大。我开始说像恰好装满的完全背包问题,面试官说有区别,让我写方程,我写了
,面试官还说不对,说
只跟
有关,最后我还是觉得有问题,但时间关系只能先接受面试官的意见,然后说我下去再思考一下)
- 最后让写一道代码题,是字符串解码。题目是给定一个字符串,目标是将写在
#
和%
之间的字符串,重复#号前面的数字次(数字只会是个位数),比如下面这个he3#llo%world
,解码后是hellollolloworld
。比较难的点是存在嵌套,比如he3#ll2#o%wo%rld
,答案是helloowolloowollooworld
,(原题的样例比这个好看一些,但我实在想不起来了)。类似括号匹配,但还涉及到字符串的复写啥的,规定时间没写出来。面试官说除了使用基本的栈以外,还需要一些数据结构的支持,存储字符串起止点之类的信息。
- 说说C++中的
二面结束后,一个小时没有接到通知,遂加了面试官微信,确认了确实GG。整个面试“轻松愉快”,面试官友好热情,温文尔雅,给五星好评,秋招还会再来。
玩笑归玩笑,总结一下自己这次面试失败学到的教训:
- 自己只找游戏开发岗,是底线,所以这次面试的目的就是找工作,并不是积累经验,没过有点不开心。
- 一面答错了一些问题,主要原因是临时抱佛脚,知识没有深入理解和形成体系。
- 二面难度不太适应,基本没有完全符合面试官预期的答案,跟我自己看到的二面面经也有差距(说好的tcp udp呢啊喂!)。上来几个问题问懵了之后就开始慌了,以后心态需要调整好,面试没结束之前永远不要放弃,这也是自己抗压能力的一种体现。
- 最后反问环节的问题一定要准备一下,可以问一下游戏相关的,不打算再问新员工培训的问题了,不知道会不会让对方觉得我是到了公司才要开始学习的。
- 自己貌似深受“读书无用论”的荼毒,虽然没有表达过,但潜意识里还是认为学校学的东西在工作中用到的概率很少,但现在我连扇自己十个大耳刮子道歉,经典和基础的知识是以后拓展技术栈的基础,十分十分重要,奉劝类似的同学早点摒弃这种想法,打牢基础,至少也能让你在面试中脱颖而出。
- 现实很残酷,没必要玻璃心,没过就是没过,重振旗鼓然后再去学习吧~