25届非科班游戏客户端春招实习总结
结果汇总:
- 简历挂:友塔、沐瞳、尚游、英雄(前面这几家是没开实习楼主硬投的)、鹰角、巨人、叠纸、电魂、数字天空
- 笔试挂:搜狐、米哈游、网易雷火、网易互娱、吉比特
- 面试挂:腾讯、剑心、西山居、灵犀、快手
- 无消息:莉莉丝、完美世界、Funplus
- offer:EA China
楼主情况:
双9非科,受崩坏3及其某次角色幕后视频影响立志转行游戏开发,遂研究生入学后就开始利用各种时间学习C++及图形学
C++方面
阅读书籍:《C++Primer》、《Effective STL》、侯捷老师四件套、《剑指offer》
视频:Cherno的C++系列
图形学方面
阅读书籍:《LearnOpenGL》、浅读《Real Time Rendering》、《Ray Tracking in one weekend》系列
视频:games101、games202、Cherno的游戏引擎系列
内功方面:
力扣400题、王道考研408四件套
项目方面:
简易标准库+简易渲染器
感想
不得不说,此次春招实习的求职难度超出了我的想象,各种挂给我挂麻了(当然可能是我确实太菜இ௰இ)。笔试方面中小厂基本是力扣中等难度为主,Hard压轴,大厂则基本都要求你拳打多维动态规划,脚踢最优路径搜索。面试基本没怎么碰到合得来的面试官,感觉他们都很关注游戏引擎的具体使用,也就是更关心游戏项目,但我的游戏项目都太简单根本不敢写在简历里,而且总的下来给面的公司也不多,以致于想积累多一些面试经验也做不到,到后期慌得不行,以至于开始怀疑学习的方向错了,做好了0offer暑假狠狠地自己做游戏项目的打算,好在最后还是有公司收留了鼠鼠,纯靠一手运气。求职不易,大伙共勉,下面附上鼠鼠为数不多的笔经和面经。
笔经与面经
柠檬微趣(2.29投-2.29笔试-5.12已终止)
应聘岗位:游戏客户端开发实习生
1.笔试题目
- 两个一组翻转链表,要求自行处理节点的内存管理
- 排序链表(链表的快排法)
- 给定一行数字输入nums,以及一个数字n,求nums中对n有相同余数的两个数,并尽可能使它们的和最大,不允许使用%运算(不许用原生的%那就自己写个函数求呗(笑),总之是排序+哈希表,哈希表可以用一维数组替代)
- 正则表达式匹配(动态规划hard题,没推出来递推式,只a了20%)
腾讯魔方工作室(2.29投 - 3.4一面-3.5挂)
应聘岗位:游戏客户端开发实习生
1.一面流程
- 简单自我介绍
- 介绍一下研究生专业
- 挑一个项目讲讲细节
- 如果有一万个数据,我只要最大的前一百的数,用什么办法
- 追问时间复杂度是多少
- 又问时间复杂度一般怎么算
- 死锁的必要条件
- 死锁避免方法
- 知道操作系统中的条件变量吗?
- 能说一下垃圾回收机制吗?(我用的c++,根本没有垃圾回收机制,我就想往内存管理那边说,但是被面试官拉回来了,非要我说垃圾回收,我就说我没了解过,他又问那能不能说一下垃圾回收的思路,我就说可能需要检测内存是否还有指向它的指针,如果没有就回收它。然后面试官又进一步问,那怎么才能知道有没有指针指向那块内存呢,我想了一会儿放弃了,说确实不会)
- 知道UE4的对象系统吗?
- 知道拉格朗日中值定理吗?
- 矩阵怎么求逆?
- 怎么计算点到平面的距离?
- 两个球怎么判断是否相交?
- 两道代码手撕:1.给定一个数组和数字,输出和为这个数的最短连续子数组的长度 2.LRU缓存
- 反问
搜狐畅游(2.27投-3.5笔试-3.12挂)
应聘岗位:游戏引擎开发实习生
1.笔试问题
九道问答题
- 给定三角形三个顶点坐标,如何判断给定点P是否在三角形平面内?
- GPU实例化和静态批处理有什么区别,各自有什么优劣?
- 体积纹理有哪些应用场景,存储细节是怎样的?
- Early-Z和Pre-Z的区别和作用是什么?
- 在多光源的渲染场景下,Forward、Forward+、Deferred渲染管线分别是怎么处理的?
- Occlusion culling 是什么,有哪些技术?
其他的忘了,属于是题目都看不懂的
莉莉丝(3.8投-3.14笔试-)
应聘岗位:游戏客户端开发实习生
1.笔试问题
12道单选题+3道编程题
单选题(按我想到的排序)
- 访问莉莉丝公司主页网址不会用到下面哪项协议?(SMTP)
- B继承自A,问用容器的什么形式可以同时存放A和B对象?(vector<A*>)
- 类A中有private的属性val,有public的方法void func(int v) { val = v; cout << "void func()" <<endl;},在main函数中使用一个A* a = nullptr,并令a->func(2),问会出现什么情况?(运行时错误,报错this指针为空指针,不会输出任何信息)
- 有函数void func(char* p) { p = (char*) malloc(sizeof(char) * 10);},在main函数中有一个一百万次的for循环,循环内代码是:char* p = NULL; func(p); free(p); 问执行程序会发生什么问题?(内存泄漏)
- 给定一个字母序列,问如果不允许连续三次的出栈操作,以下那个序列不可能是序列的出栈顺序?
- 已知25 13 10 12 9 是一个大顶堆的序列,问在末尾加入数字18,到重新调整为一个大根堆需要经过多少次比较操作?(我选的2次)
- 给定一个序列,说这是排序两趟后的结果,问使用的可能是哪种排序算法?
- 问解决”数组中的第 K 个最大元素“问题使用的选择快排法的平均时间复杂度是多少?(O(n),我选错了呜呜呜)
- 问第二次握手后,连接发起端的状态是什么?(SYN_RECEIVED)
- 给定树的前序排序和中序排序,问后序排序是什么?
- 多线程共享变量不加锁时,问输出的结果有哪几种?
- 还有一道想不起来了(O.o)
编程题
- 给定一个链表,假如是1->2->3->4->5,要求返回成:5->3->1->2->4,具体的规则是,将头节点后的节点作为新链表的头,然后后面的节点依次,先加到新链表的尾部,再加到新链表的头部,再加尾,再加头,以此类推,直到加完所有的原链表节点(维护一个prehead用来插入到新链表头部,以及一个post指针——一开始指向head节点,用来插入节点到新链表尾部,然后就是指针操作辣)
- 给定一个数组,其代表一个头尾相连的环,问,切两刀将环变成两部分,如何切使得左右两边的数值和的差值绝对值最小,返回这个最小值(我的思路是,将问题转换为,找到一个使得abs(subSum * 2 - sum)最小的连续子数组区间,其中,subSum是子数组的数值之和,sum是整个数组的数值之和,感觉应该要用线段树,但我不会,所以直接暴力计算了所有连续子数组的数值之和,具体是利用前缀和来算连续子数组的数值之和的,通过双层for循环,一直计算subSum,然后让res = min(abs(subSum * 2 - sum), res);,最后理所应当的超时了,只通过了70%(ㄒoㄒ))
- 给定一个数组,问最少去除掉多少个数字,可以使得原数组满足A1 < A2 < ... Ai > Ai+1 > Ai+2 >... Ak(不会)
西山居(3.5投-3.17笔试-4.11一面-5.6感谢信)
1.笔试问题
4道单选+6道多选+2填空+2编程+1问答
- 单选题
- 给定一个升序序列,问找到一对a和b,使二者和最接近target的最快算法的时间复杂度是多少?(O(n),双指针)
- 给定后序排序和中序排序,问前序排序
- 两个人掷硬币,谁先掷到正面,谁先吃苹果,问第一个掷硬币的人吃到苹果的概率有多大?(2/3,无穷级数)
- 计算机图形学中深度缓冲的作用?(判断前后)
- 多选题
- TCP、UDP及IP协议的意义及作用
- 可能的出栈顺序
- 线程和进程的区别
- 以下哪些算法用到了贪心思想:Dijkstra寻路算法(√),弗洛伊德寻路算法,最小树生成算法(√),还有一个选项忘了
- 其他两题怎么也想不起来了
- 填空题
- 有函数定义:问x(x(8))会调用多少次函数x()(我算的好像是18次)
- 有一个二维数组,array:100行 65列,下标从1开始,数组起始地址为10000,数组每个元素占两个内存单元,问array[56] [22]的地址是多少?
- 编程题
- 现在有n个小岛,给定一个n*n的01矩阵matrix,matrix[i] [j]==1代表第i个小岛到j个小岛是连通的,==0则代表不连通,问这n个小岛可以组成多少个岛群?(dfs,AC)
- 给定一个长字符串long,以及一个短字符串数组vector< string > shorts,现在要求你返回用shorts里的字符串组成long的一个方案,方案以下标数组的形式返回。(哈希表+回溯,AC)
问答题
- 题目很长,简单概括就是给定了一个种田游戏的情景,问你怎么从程序上设计,以及你觉得重点的实现
2.面试问题(线上30min)
- C++进程包含哪些部分?
- 内核空间是每个进程都有的吗?
- malloc和new 的区别?
- 虚拟内存是什么?
- malloc出来的内存是在物理内存还是虚拟内存?
- 进程和线程的区别?
- 线程之间不共享哪些东西?
- 除了堆栈、寄存器还有吗?
- 了解缓存吗?了解linux吗?了解网络编程吗?
- 标准库里的hashtable是什么容器的底层?如何实现的?
- hashtable怎么做扩容?
- 使用标准库时又是会出现迭代器失效的情况,这种情况一般是怎么回事?
- 你觉得你做游戏开发有什么优点和缺点?
- 你觉的自己的代码水平如何?
- 你平时有和其他人交流代码吗?
- 反问
EA中国(3.6投-3.23笔试-4.12一面-4.26二面-5.7oc-5.29offer)
1.笔试问题
- 15道单选(39分)
- 10道多选(31分)单选和多选题目太多了,而且存在很多看程序说输出,以及指出错误和填补代码的题,就不在此列举了
- 2道编程(30分)反转给定int数字(转换成string,反转完转换回来就行)返回二叉树和为targetSum的路径,路径是指头节点到叶子节点经过的所有数字(随便哪个遍历算法+回溯就行)
2.面试问题(一面34min)
- 自我介绍
- 你常用的数据结构有哪些?
- unordered_set怎么实现的?
- 讲讲你的哈希表的实现?
- 那map的底层实现呢?红黑树的特点?
- 你的简易标准库的sort函数是怎么实现的?
- C++11有哪些新特性,说说你常用的?
- 右值是用来解决什么问题的?使用的时候需要注意什么?
- 翻看笔试试卷,拿了几道错题问知不知道错在哪
- 线程和进程的区别?使用多线程的时候要注意什么?
- new和delete与malloc和free的区别?
- 渲染过程中我们一般需要写哪些shader,它们具体的作用是什么?
- 共享屏幕展示自己写的一些shader,讲下效果及原理?
- 角色描边效果除了你写的这种实现还知道哪些实现吗?
- 讲讲PBR?
- shader里一般不用ifelse语句,这是为什么?
- 反问
3.面试问题(二面25min)
- 讲讲自己项目的highlight?
- 讲讲你理解的渲染管线?
- 假如说游戏中有一块半透明的蓝色宝石和一块红色宝石,怎样保证它们叠在一起的时候拥有正确的视觉效果?
- 平时图形学相关的知识你一般从哪里获取?
- C++中从文本文件到可执行的exe文件中间经过了哪些过程?分别有什么作用?
- 假如我有两份相同的Source Code,我拿着它连续编译两次,你觉得得到的两份exe文件它们是二进制一致的吗?为什么?
- 如何理解C的malloc和C++的new的区别?
- delete数组的时候,是怎么知道要delete掉多少个元素的?
- 平时玩哪些类型的游戏?
- 像MOBA类游戏,它一般会有同步机制,说说你了解的同步机制?
- 反问
完美世界(3.11投-3.23笔试-)
1.笔试问题
太多了太多了,根本记不过来,20道单选(40分),10道多选(30分),2道编程题
- 编程题
- 判断给定链表是否是回文链表(12分)(快慢指针找到中部指针,根据快指针的最终状态,确定链表是奇数个还是偶数个,然后断开后半链表,将其反转,再将其和前半部分进行比较,若完全相同,则是,否则不是)
- 给定n个{l,w,h}的数组,n,l,w∈[0,3000],数组元素分别代表立方体的长宽高,堆叠要求:立方体不能旋转,摆在上面的立方体长宽均小于(注意不能等于)下方的立方体的长宽,问给定立方体最高能叠多高?(18分)(尝试使用动态规划解了,dp数组表示长宽分别为i,j的立方体为底时最大的堆叠高度,但这样数组就需要dp[3000] [3000],显然太大,即使使用滚动数组,仍然需要遍历双层for循环3000次,会超时。没时间了,就直接提交了,吃25%的分也是分,没办法太菜了〒▽〒)(后刷题发现是力扣原题354)
快手游戏(3.13投-3.29笔试-4.9一面-4.16感谢信)
1.笔试问题
11道单选题(25分)+ 8道多选题(24分),3道编程题(51分)
- 单选题(放两个我不确定的)
- 有A、B、C三个盒子,只有一个盒子里面有球,现在你任意选一个盒子,例如你选了B,然后我会告诉你A、C中哪一个没有球,比如我告诉你A没有球,那么现在B、C两个盒子,有球的概率分别是多少?
- 有一副扑克牌,在抽到红桃之前不停止(抽完放回),问平均一次能抽到多少张红桃以外的牌?
- 编程题
- 一款2D游戏,你作为玩家可以释放一个技能,从而摧毁所选中的释放位置AABB[W,H]范围内的所有小怪。现在地图上有N(N ≤ 10000)个怪物,用整数Xi,Yi(其值在[0,4000])表示怪物在地图上的位置,以及该怪物被摧毁可获得对应的分数Vi。将作用范围为[W,H]的技能作用在不同位置,可以获得不同的分数值,请设计程序计算最大的分数值Vm。(尝试了,但只过了33%,寄)
- 游戏的UI渲染中,表现为若干矩形区域的多层级覆盖绘制操作。每个UI渲染区域都是一个矩形,并且都是和屏幕边框平行或垂直的。每个渲染的矩形区域也可以部分或全部被其他区域覆盖。所有矩形并集的边界的长度称为周长。(寄)
- 有一个含N个整数的序列,对任意给定得M个整数(可能出现重复值),求一个最短区间,要求该区间包含这M个整数值,并输出该区间长度。(和热题100里最小覆盖字串差不多,不过我看错题了,以为要包含M个整数组成的序列,但其实只要包含M的数值就行,虽然AC但是浪费好多时间)
2.一面问题(线上45min)
- 自我介绍
- 手撕算法题:给定字符串s及数字n,返回含有n个不同字符的最短子串的长度(滑动窗口秒了)
- 讲讲自己熟悉的渲染效果的实现?(PBR三个部分都扯了下)
- MipMap的原理?是用来解决什么问题的?
- 阴影技术有哪些?(ShadowMap+PCF+PCSS)
- 讲讲SSR?
- 怎么学图形学的?
- 反问
灵犀互娱(3.8投-3.30笔试-4.10一面-)
1.笔试问题
20道单选(100分)+5道编程题(350分:50+60+70+70+100)
- 编程题
- 给定一段英文字符串,以单词为单位进行翻转字符串输出。(先反转整个字符串,然后逐个翻转单词就行,没有不符合规范的空格,AC)
- 小杰在异世界探险时发现了一个有着奇妙法则的地方,灵犀帝国。这个法则让灵犀帝国的人不再为食物而烦恼。每逢每个月的最后一天,在灵犀帝国中的人会进入到其对应的奇妙领域,届时会有n轮食物大派送降临。奇妙领域存在着一条m个格子的路,在每轮的食物大派送中会在[l, r]的格子上放一颗灵果。此时小杰已经进入了奇妙领域,如果小杰将n轮食物大派送的所有灵果取走会拥有多少颗灵果呢?(这题纯考察理解能力和处理输入的能力,输入完就做完了,AC)
- 灵小犀踏上了一场充满神秘的符文之旅。他手中拥有记录着神秘的符文串 s1。经过漫长的探险,小犀找到了另外一串神秘符文序列 s2。它的任务是解开这两块符文之间的联系:确定是否可以在 s2 中找到 s1 的一个排列。换言之 s1 的任意排列之一是 s2 子串(哈希表+滑动窗口,但是只过了70%,现场没找到问题出在哪)
- 在一个名为“奥术计算”的魔法世界中,学徒法师们正在学习施展魔法的基础知识。他们通过将一系列的魔法元素符号(代表魔法的基本操作,如加法、减法、乘法和除法)与能量水晶(代表数字)结合,来施展一段连续的魔法。每个学徒法师的目标是计算出这段魔法的最终魔力值,只有整数形式的魔力值才是有效的。魔法元素符号的优先级与普通的算数规则不一样,乘法和除法的优先级低于加法和减法。学徒法师们需要小心处理魔法元素之间的顺序和优先级,以确保能正确计算出魔力值。(模拟简易计算机,两个栈,一个数字栈,一个符号栈,然后就是复杂的进栈出栈逻辑,最后说我栈溢出了,o( ̄┰ ̄*)ゞ,50%)
- 小杰在灵犀帝国已经休息许久了,现在回想起进入灵犀帝国的那一天都感到无比幸运。在一个雷雨交加的晚上,小杰听到了悠扬的歌声。小杰追寻着声音遇到了一位和蔼的老者,他笑着跟小杰说:“进入灵犀帝国的机会已经来临了。”接着他给了一副地图给小杰,地图上有两个光点,一个是目前小杰身处的位置,一个是灵犀帝国所在的位置。在这两个点之间还存在n-2个地点与m条路,每条路上都有一个能量值w。小杰疑惑的看着老者,老者又说:“去找吧,找到那条最大能量与最小能量比值最小的路,你就能找到神秘的灵犀帝国。”(直接深搜超时了,想不到更好的解决办法,20%)
2.面试问题(一面30min)
- 自我介绍
- 两个项目是基于什么样的想法去做的?
- 你觉得哪个项目你做得更好一些?
- 那做这个项目的时候有遇到什么困难吗?
- 哈希表是怎么实现的?
- shared_ptr和weak_ptr你是怎么实现的?
- 它们资源管理的作用在构造函数和拷贝相关函数里是怎么体现的?
- 讲讲你的简易渲染器项目?
- 平常怎么学图形学知识?
- 有实现哪些效果呢?
- 人物描边效果你是怎么做的?
- 深度测试一般是用来做什么的?
- 和透明度测试的关系?
- 快排的原理?最大的n个数怎么快速找出来?
- 深度优先搜索和广度优先搜索的区别?
- 设计模式了解过吗?讲讲观察者模式?
- 了解unity吗?讲讲unity的面向对象?
- unity脚本的生命周期?
- fix Update和Update有什么区别?
- 反问
吉比特(3.6投-4.7笔试-4.22感谢信)
1.笔试问题
单选题(16*2.5=40分)填空题(2 * 5=10分)编程题(10+15+25=50分)
- 单选(只记得几个我不确定的了)
- 已知在三维坐标系中有一个半径为1的圆柱体,其轴线位于xy平面上,且其轴线与y轴的夹角为30°。现在圆柱沿垂直于轴线,且平行于xy平面的方向开始滚动。已知运动起始时其重心位于原点位置,标记点位于坐标(0,0,1)。当圆柱重心移动了π/4距离之后,标记点在x轴方向上移动的距离为多少?
- 关于TCP协议,下面说法错误的是
- A.如果发现一个TCP连接长时间处于CLOSE_WAIT,说明四次挥手没有正确执行完。
- B.TIME_WAIT状态,可以避免延迟抵达的数据包影响新建立的TCP连接的数据接收
- C.如果某个TCP连接处于ESTABLISHED状态,表示该连接正在进行数据传输。
- D.主动关闭TCP连接的一方会比对方先进入TIME_WAIT
- 状态数字规律题:6,60,210,_,990 A.504 B.621 CD忘了
- 现有字符集{a,b,c,d,e},其出现频率为{5,3,1,2,1},问将其用哈夫曼树保存后占用多少字节?
- 填空题(都是问程序的输出结果,代码不让复制)
- 编程题
- 给定len1, k1, len2, k2分别代表数字串M和N的长度以及其分别的进制数,k1,k2∈[2,9],输出M和N的关系(全部转换为10进制比较大小就行,AC)
- 给定长度为n的数组nums,在数组中设置间隔以分组,若使分组后有:N1 <= N2 <= N3 <= ... <= Ni,N指分组后组内值之和,问i最大为多少?(用回溯暴力搜超时了,50%)
- 给定m行n列的数组作为地图,数组中的值代表走到该处能够获得(正数)/消耗(负数)的行动力,玩家从左上角出发(左上角地图值并不一定为0),只能往右或者往下走,行动点数<=0时是无法行动的,问玩家走到右下角需要具备的最小初始行动值是多少?(动态规划,类似力扣原题“地下城游戏”,AC)
剑心互娱(3.5投-3.26笔试-3.28一面-4.8二面-4.10感谢信)
1.一面问题(线下1h)
- 自我介绍
- 平时如何自学计算机知识及相关技术?
- 最近在学什么?
- 看代码找问题:给定无返回值函数A接收char指针,在指针内部delete该指针又重新new了大小为10000的char数组给该指针,main函数里先new一个大小为8的数组给char指针p,调用A(p),再delete p,问会出现什么问题?
- delete[]时,怎么知道要delete多少个元素的?
- 你说会记录一个数组大小在头指针附近,到底是在前面还是后面呢?这个是编译器做的还是操作系统做的?
- 那最终归还内存,是如何传参给相关接口的?
- sizeof函数是编译期行为还是运行期行为?
- 看一段代码找问题(虚函数相关,公有继承中子类对父类属性的访问权)
- 菱形继承用来解决什么问题,怎么解决的?
- 如何判断一个链表里有环?
- 用快慢指针的话,快指针和慢指针一定是一个走两步一个走一步吗?快指针走三步有影响吗?给一个证明?
- 给定一个生成随机数组的函数,实现一个指定n,生成一个1-n的随机序列的函数?
- 你的实现时间复杂度是多少?(for循环给结果数组依次赋值,hashtable记录出现过的数字,碰到出现过的就重新调用随机数函数)
- 怎么学图形学的,有没有想过自己实现一个软光栅器?
- 讲一下pbr渲染?
- 那你这个移动光源的光照贡献是在哪加进去的?
- 光源效果直接叠加的话会不会有什么弊端?
- 你的这个Kulla-Conty项是用来解决什么问题的?
- 平时都玩什么游戏?
- 自己的职业规划是怎样的?
- 你觉得你的规划难点在哪?准备怎么克服?
2.二面问题(线上50min)
- 自我介绍
- 为什么考研没有往计算机专业考?
- 你现在只考虑游戏行业的话,本专业不是浪费掉了?
- 没考虑过当策划吗?
- 你做过什么游戏相关的项目吗?
- 游戏开发的过程中自己有碰到过什么问题吗?
- 怎么学计算机知识和相关技术的?
- 介绍一下简易标准库的项目?
- 有没有对比过与标准库的效率差距?
- 图形学是怎么学的?
- 学过编译原理没?代码从文本文件到exe文件经过了哪些阶段?
- 链接阶段的连接相关文件具体指什么?
- 模板编程时,模板的声明和定义分开在头文件和cpp文件里会怎么样?
- deque的实现是怎样的?
- 为什么用类似二维数组一样的实现方式?
- 具体数据插入时的过程是怎样的?
- 和一面一样的代码阅读题
- 代码题:给定两个升序序列A和B,最终A和B中数据的存放规律是“将A和B的数据整合后,按发牌方式分别存给A和B”,要求不使用额外空间
- 反问