Files
obsidian-notes/2Areas/面经/腾讯 网易 完美 字节 游戏客户端 游戏引擎(2020暑期实习岗) 综合笔 面经.md
zzzisfunnyboy 6a345a3ab1 1
2025-07-17 23:59:13 +08:00

167 lines
19 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

**笔经(客户端+引擎)**
  游戏客户端这个方向不论客户端还是引擎,大体上前置的**基础笔试题都是以[C++基础](https://zhida.zhihu.com/search?content_id=117618478&content_type=Article&match_order=1&q=C%2B%2B%E5%9F%BA%E7%A1%80&zhida_source=entity)[STL](https://zhida.zhihu.com/search?content_id=117618478&content_type=Article&match_order=1&q=STL&zhida_source=entity)为主偶尔参杂一些数据结构和算法整体而言对OS、数据库、网络、编译原理等等其他知识要求不高甚至几乎不考。**这部分分值一般不高。
  **重头戏一般是编程题,简答题**,大分值都在这边。
  **编程题**基本算是ACM入门+进阶级别例如基础的模拟题、搜索题、数学题、并查集等稍难一些就是DP相关以及部分变种题比如有一次我碰到了一个树状DP当场甚至没想出来。某些企业会结合游戏相关给你出一些比如渲染物先后排序问题和骨骼运动等算法题网易[雷火引擎](https://zhida.zhihu.com/search?content_id=117618478&content_type=Article&match_order=1&q=%E9%9B%B7%E7%81%AB%E5%BC%95%E6%93%8E&zhida_source=entity)实习 4小时这类题一般都是要求你看懂题然后进行模拟代码可能相对长一点如果你本身就会相关的骨骼动画、四元数和透明度计算算法等等那你看懂题会很顺利
  **简答题**这些题往往会结合游戏背景给你出一些简单的游戏架构设计题或是功能设计题某些不考编程题的企业会在这部分放入算法题让你写伪代码和思路。比如设计rouguelike游戏的随机地图固定场景内生成多个随机可达的房间要求出入口尽可能远设计简易的游戏组队系统等等。
  **PS多嘴一句对于不少人而言笔试很可能只是参考如果你的简历很好那你即便笔试0分也是可以收到面试的。**当然前提是你的简历够出色以至于HR和面试官对你感兴趣。**相反即便你笔试满分如果岗位需求过高HC不够了或者部门对你的简历没有兴趣也会直接把你筛掉。**(我之前投阿里的计算机图形学,笔试题满分,照样没有人找我面试)因此,对于很多**私企**而言,笔试只是一种手段,不要太过在意。
---
**面经(客户端+引擎)**
  面经的部分具体问题我不分一面二面三面因为各企业对不同阶段的面试要求不同比如有的企业不管哪一面都会很详细地问你C++基础图形技术游戏技术等等但大部分企业是前面一部分面试偏重C++基础,简历印象面试,了解情况等等,后部分偏重对你简历中提到的项目,或者是实际工作时,可能会遇到的引擎或项目技术相关的问题进行提问。
   **1. 面试过程(四个)**
**腾讯**
  提前批没有笔试,开始我面的是**引擎岗.**
**第一个部门**的**一面**对我印象比较好,**二面**问了一个算法题和场景题(我后面会提到),答得不好,过了几天虽然到**HR面**了但还没面HR就被从HR面的状态换成初试了我问了其他HR回复我是部门内部调整给我换了部门但是我估计是HC不够了.
**第二个部门**也是**引擎**但是可能招满了压根没看应聘信息半个月了都没有面我状态都是初试的状态于是我让HR把这个部门的投递撤掉了。后面**换成客户端开发**重新进大池子等部门捞我(…心酸)
**第三个部门(游戏项目组)**的面试官第二天跟我约了一面,这次的部门效率感人…(可能要到截止日期了)。
**一面**面完对我印象不错,当天改状态,下一个工作日二面。
**二面**问我自己的课题项目问了一个小时,非常之具体,包括改进问题,为什么不做各种改进等等都问得很清楚,二面貌似也是当天改状态**HR面**然后约了第二天早上面HR三天后OC。
**网易雷火**
  **引擎岗**,网易的时间线很长,因为没有提前批,只有一批次,所以我是三月就投了简历,三月底才收到笔试通知。
**笔试**大概4道编程题4小时A掉前3道最后一道思路有点问题。四月初面试陆续一面二面三面。
**一面**一开始就摆出好几道选择填空让我当场做一道道看然后后面基本的C++底层多态然后面试官开始往深了挖我的C++内存结构前面基础题我其实很多没答上来dx也没写过旋转矩阵逆推也没推出来...可能是面试官觉得我内存结构这一边答得比较有意思让我过了)。
**二面(一面当天下午)**面试官一看就是阅游戏无数开头就跟我聊玩过什么游戏什么的聊家常因为网易雷火邮件招聘系统貌似出了点问题好几个人没收到面试通知包括我后面是HR打电话通知我面试的所以多了一段空窗期然后开始聊我这边的项目问我对游戏技术引擎的了解什么的。
**三面**估计是部门主管一开口就是老领导了…跟我聊了国内游戏发展现状然后教育了我可以用我的方向来做游戏里面的一些东西聊了很久…最后快结束的时候突然开始面我数学算法题后面说和C++底层问C++内存结构的最后还问了我offer情况。
再过了几天就**HR面**了和腾讯同一天面晚腾讯一个半小时HR这里问的比较不一样的地方是问我遇到过最大的困难和难题是什么怎么解决的以及问了我其他的offer的情况。三天后OC比腾讯晚一个半小时这俩企业真准时…
**完美**
  提前批,我投的**客户端**不过我稍微提下…我是面试后才知道完美世界是20年暑期实习和21届校招一起招的意思就是你投的实习面的就是校招过了明年就是他们的人了Hmmm…我该怎么说这事情是不是该提前在招聘的时候说一下
**笔试**比较正常大概一个半小时有选择和填空编程题很简单4道题A掉3.875道。
**一面**很注重基础老样子C++基础STL不一样的是这个部门的面试官会让你手写渲染代码比如[phong模型](https://zhida.zhihu.com/search?content_id=117618478&content_type=Article&match_order=1&q=phong%E6%A8%A1%E5%9E%8B&zhida_source=entity)),我写得不好…当时没复习,一脸懵逼,于是蒙蔽地说了一下我印象中的模型计算。
**二面**除了面少部分C++底层,主要是问我的项目和[ACM竞赛](https://zhida.zhihu.com/search?content_id=117618478&content_type=Article&match_order=1&q=ACM%E7%AB%9E%E8%B5%9B&zhida_source=entity)的经历遇到过什么算法的难题怎么解决该怎么在竞赛上进步等等。还有一点不一样的是二面面试官会把企业工作编程的时候实际遇到的各种调bug团队协作问题拿出来问我会怎么从代码上进行解决。二面面试官很有意思实力很强会帮你把你说错的地方或者算法讲漏的地方甚至以前遇到的难题解决思路的漏洞都给你找出来然后比较委婉地告诉你。应该是我遇到的印象最好的面试官了。大概是过了几天就给了**HR面**oc比较早
**[字节跳动](https://zhida.zhihu.com/search?content_id=117618478&content_type=Article&match_order=1&q=%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8&zhida_source=entity)**
  **引擎岗**,说实话,字节游戏这边是新部门,去年才开始发力自研游戏,所以每个人见解不一样吧,工资给的虽然高,但还是需要多考虑一下。
**笔试**都是编程4道题前三道A掉最后一道10% case水过…。过几天就提示笔试过了准备面试但字节面试周期贼长一面结束下周再面二面结束也是下周才HR面给OC。
**一面**考察C++基础和底层但不会很深然后给两道简单的搜索算法题给我敲第一题先敲完之后可能面试官觉得我敲得太慢了第二题就直接口述思路都是DFS结束第一题稍微利用到了栈。
**二面**面试考查范围比较大一点,但都不深,后面考我前序遍历非递归手写,开始搞成了中序遍历 (中序更复杂一点)写完才意识到要写前序…反正顺利写出来了测试也过了。其中有个小插曲是我回答sizeof的时候没有注意”\078”这种八进制转义字符的问题答错了…好尴尬…。但幸运的是过了一周收到**HR面**OC了。
  具体的问题我就在下面分类列举了,没有按企业来分,因为时间跨度太长,有一些问题哪些企业问到了我也不太记得了,甚至有些细节题我可能也忘了。我尽量回忆出比较关键的题目和所属企业。
**2. C++基础、STL和底层部分**
1. const的作用完美一面
2. static的作用完美一面及其他全局常量和变量如何使得整个程序可见完美二面
3. new和malloc的区别以及new的优点能说多少说多少完美一面
4. this指针
5. inline函数和宏的区别inline是否是在任何时候都展开代码完美一面
6. extern “C”的作用字节二面
7. 多态的底层实现,紧接着可能会问虚函数的内存布局,包含虚函数的对象本身的内存大小问题,多继承问题等(几乎所有企业都面到了)
8. 虚函数的默认参数问题以及为什么会这样默认参数具体存在哪个C++分区等?(雷火一、三面)
9. 虚析构函数的作用(多数企业都问过)
10. C++的引用是怎么实现的,为什么要这样?(雷火三面)
11. C++ STL中存在的陷阱你碰到过哪些腾讯引擎一面
12. C++ 11的新特性有哪些腾讯引擎一面
13. C++11智能指针腾讯、完美面到了其中完美一面要求手写实现一个shared_ptr
14. C++在什么情况下会发生拷贝?(莉莉丝一面)
15. C++内存分区有哪些企业面C++底层都会隐含涉及到这一点,完美一面直接问了)
16. sizeof和strlen的区别以及字符串的sizoef计算中\0和八进制转义字符问题例如sizeof(“123\04567”)。引申有十六进制转义字符问题(字节二面)
17. C++右值引用的作用,右值是什么等等(腾讯客户端一面,从另一个问题挖出来的问题)
18. STL中vector的实现原理map的实现原理有序和无序大部分企业都面到了
19. C++所有的构造函数包括哪些?(腾讯客户端)
20. 用内存拷贝的方式直接拷贝vector本身会发生什么会存在什么陷阱腾讯引擎
21. 深拷贝、浅拷贝的区别
**3. 数据结构**
1. hash表的构造、插入查询和删除具体各有哪些方式雷火三面莉莉丝其中要注意删除的实现
2. map中红黑树的实现以及对红黑树的了解 无序map和有序map的差别、优缺点自定义数据结构怎么使用map莉莉丝一面
3. 接着第2题如果给定很多用户其中key值可能包含地区、单位等两到三个。如果让你来设计你会采用红黑树这种方式还是hash表这种方式来进行存储查询为什么莉莉丝一面
**4. 图形图像、数学基础、引擎相关**
1. 齐次变换矩阵逆推知道M4*4的矩阵求M=RST中的R、S、T三个矩阵具体是多少雷火一面
2. 光的反射计算公式?(雷火一面)
3. 了解什么局部光照方法手写一个phong光照(完美一面)
4. 一张1024*2048的图片大小是多大字节二面
5. 是否写过引擎?对游戏引擎的了解?一个游戏引擎应该有什么样的功能,在游戏开发过程中承担什么样的责任?(不少引擎岗面试都问到了类似问题,因为我没有实际写过引擎,所以大部分没有和我聊过于具体的技术)
6. 抗锯齿的方法?多重采样的实现?怎么找边缘(雷火二面)
7. 知道哪些几何相关的算法?网格处理在游戏领域的运用具体可以做哪些事情?(腾讯引擎二面,雷火三面,雷火这里聊得很详细)
8. 渲染管线的过程(腾讯引擎,字节,雷火)
9. 渲染流水线中进行裁剪的地方有哪些?视锥体裁剪、背面剔除具体是怎么做的?背面剔除的实现方法?提前剔除应该怎么做?(雷火三面,答得不好,被教育要多看看相关的基础知识)
10. 怎样做提前深度剔除?(雷火三面)
11. 分离轴算法的计算过程?凸多边形如何利用分离轴进行判交,需要多少个轴?(腾讯客户端一面)
12. 了解PBR么有什么实现方法腾讯引擎一面
13. 局部光照模型有哪些?全局光照方程要怎么计算?(腾讯引擎一面)
14. OpenGL的可编程管线流程几何shader的作用为什么一开始就从应用程序输入到几何shader而是顶点shader还知道哪些shader完美一面
15. 了解哪些后处理技术?
16. OpenGL ES了解多少
**5. 算法和编程相关(包括思路题和手撕代码题)**
1. (a^n) % 10怎么实现a和n都可以很大。雷火三面最快的是O(1),如果不知道可以网上找一下题解)
2. 一个二维空间x和y轴都是10000以内的正整数其中有2n个随机顶点求一个圆C。使得圆C内有n个顶点圆外n个顶点注意圆周上不能有点。腾讯引擎二面注意要尽可能地快且保证算法收敛并且不受浮点数误差影响
3. 场景题一个地形网格三维地形有高有低其中xy方向上为固定尺寸每个网格都是一个1*1的单位正方形。有一个camera在某一个位置如何优化/简化网格,实现快速地形渲染,并保证渲染后屏幕像素误差不超过一个像素。(腾讯引擎二面)
4. 有一个不包含重复数字的数组比如A=[2,3,5,7], 有一个数字x比如x=7编程求解有多少组该数组中数字的和为x并输出这些数组数组中的数字可以重复使用例如上例中{2, 2, 3}, {2, 5} {7}这三组数据将被输出(字节一面)
5. 有一个二维字符数组map有一个单词word查找map中是否存在word单词类似成语接龙该单词可以呈上下左右的接龙形式。例如有一个单词zoo字符数组如下字节一面
w e z o
t w o q
w w o u
s g s s
6. 前序遍历的非递归实现,写代码(字节二面)
7. 单例模式的实现,写代码(雷火三面)
**6.** **项目、开放题相关**
  这里稍微说一下项目的问题,**企业看简历还是非常看重项目的**如果项目够好或者够吸引面试官很多到了项目面的时候可能就不会谈太多C++和算法题,而是问你自己项目中的很多引申问题以及为什么要采取这样的技术,不去做那样的事情等等,这种时候因为都是自己做过的,所以会更容易回答。现在回忆到的游戏或项目较通用的问题如下
1. 团队组成项目中负责的是什么遇到哪些难题怎么解决的这种HR问得比较多
2. 如果你接手一组代码,可能被很多人修改过,组织比较混乱,你需要在很短的时间内把一组代码整理好,并组织成可读性更高的代码,你会怎么做?(完美二面)
3. 怎样在保护一段代码的情况下,为它添加新的功能?(完美二面,设计模式相关)
4. 有若干的人会用你自己写的内存池(因为我前面回答的时候提到了内存池的多态写法),但是其中有一个人写的代码没有释放资源,长时间会导致客户端崩掉,你要怎么从代码的层面修改代码以发现到底是谁的代码/哪一段代码出现了这种没有释放资源的问题?尽可能以自动化的方法自动检查?(完美二面)
5. 你的项目中有什么现实的需求,可以做到哪些事情?(我的属于应用研究课题,大部分企业都问到了)
6. 你用的网格简化算法具体是怎么实现的?有些特征不保持/形态丢失的情况怎么办?(腾讯客户端二面)
7. 玩过哪些游戏?看的书和论文有哪些?平时是怎么学习的?(大部分企业都问到了)
8. 你相比其他人在引擎岗上有什么优势因为我没写过引擎所以腾讯引擎一面问了我我回答是几何优化所以二面问了我几何优化但是我没答好所以即便二面被挂我其实也是知道为啥的这就是自己挖的坑2333不过即便这样二面也过了可能是对我一开始的印象好
---
**后记**
  最后还是选了腾讯客户端主要的考量是引擎从业人数过少而且面了这么多次之后我大概也知道自己对引擎这个岗还是缺乏一些实际的经验。因为我本身是做数字几何的因此自己的项目和课题都没有过多关注渲染也没有实际用引擎写过游戏项目直接上引擎岗会很吃亏。再就目前的国内游戏行业而言大部分情况下引擎岗也不需要那么多的较新的网格处理技术而引擎开发的各个讨论区都是以渲染为主。这一点雷火那边的面试官和我聊过也指出了国内游戏和国外3A的差距很有意思。但不管怎样这的确不是短期内能解决的。
  归根结底工作是工作兴趣是兴趣估计不管是引擎开发还是客户端开发工作许久之后还是会厌倦。有个已经工作的同学告诉我如果我像他一样超长加班到12点每日如此工作两年以上会很讨厌开发的。我其实很认同这句话但我也只能尽量不这样工作同时尽可能对游戏开发保持一份热忱
  如果一定要做一个总结,**笔试部分**不管怎样都逃不过刷题至少leetcode级别的题目肯定都是要做不少的这对面试也很有帮助反复练习就会得心应手。**面试部分**如果临近面试招聘还是尽可能地直接看面经总结自己的回答加上自己的理解遇到C++底层的问题偶尔可以尝试直接用反汇编的方式看看汇编代码是如何实现的特别是指针、地址和内存的部分。如果时间还比较长还是要尽可能在你做的项目里面活用语法、数据结构尽可能多地使用C++11-20的新特性尽可能多地尝试一些必要的设计模式慢慢对C++和数据结构、设计模式这些内容有更深的理解会更好。
  另外**对C++底层**我有一些个人的理解和看法不管你会不会某个语法和库功能细节的底层知识你考虑问题首先要把自己放在一个语言设计者或是标准库设计者的位置来思考这个问题这样不管你的回答是否正确至少在面试官眼中你都是以一个底层设计者的思路在设计而不只是一个使用者或许这个时候真正的答案就不太重要了。当然答错了还是要反思的2333