游戏客户端开发面经合集
完整信息
本篇目录
个人情况:bg双9,一段雷火日常实习一段某F4暑期实习。个人研究方向是图形学,不过找工作的目标是客户端方向。第一引擎岗太少了,有很多优秀的同门有论文有多段引擎岗实习最后也没有转正机会,秋招竞争也很激烈;第二引擎岗也不是全部在做渲染相关的工作,大部分时间都在处理性能/崩溃或者在做编辑器工具;第三纯粹的图程岗更是只有很少的公司有;至于TA,不会各类dcc软件也没有作品集,而且在有些公司TA算美术岗不算技术岗工资还低人一等(说的就是你腾讯)
游戏引擎方面只会UE,语言就是C++和lua,记录一下面试中遇到的各类比较普遍的问题,实习和个人研究内容相关的这种就不记录了,timeline可以看另一个帖子。
整体感觉是秋招相比实习来说,直接问八股的少了,一般都要结合场景问题以及你的实习经历项目经历穿插八股来问,有些会挖得很深。另外就是基本每个面试官都会问一些AI相关的问题。
C++
1、sizeof和strlen的区别
2、const关键字,const int* p,int* const p有什么区别
3、static关键字
4、explicit关键字,什么情况下应该禁止隐式类型转换
5、结构体字节对齐
6、define inline typedef
7、四种类型转换
8、dynamic_cast的底层原理,实例的type_info存在哪的
9、多态是怎么实现的
10、虚指针和虚函数表
11、类的初始化顺序,考虑虚继承、多重继承情况下呢?类成员的初始化顺序和初始化列表顺序有关系吗?
12、基类的析构函数为什么应该声明为虚函数
13、虚继承解决什么问题
14、深拷贝和浅拷贝
15、纯虚函数本身可以有实现吗?
16、类的成员模板函数可以是虚函数吗?
17、构造函数可以是虚函数吗?
18、构造函数可以调用虚函数吗?
19、三种智能指针
20、shared_ptr是不是线程安全的?shared_ptr的控制块在内存的什么位置?
21、malloc free new delete
22、delete[]怎么知道需要释放多少内存的
23、vector的扩容机制,push_back和emplace_back的区别
24、vector迭代器在什么场景下会失效
25、右值引用和移动语义
26、C++的内存分区
27、在析构函数中delete this会发生什么
28、为什么析构函数不应该抛异常?
29、(int)0.1和(int)-0.1的结果为什么都是0?
Lua
1、Lua table有两个遍历方法ipairs和pairs有什么区别,如果table中既有数组部分又有哈希部分ipairs遍历结果是什么?
2、Lua怎么实现面向对象?Lua中各个元方法的意义?
3、Lua的GC
4、Lua的协程
5、Lua的热更新流程
图形学
(我自己是学图形的,可能面试官会问得多一点,一般情况下应该不会问太多图形问题)
1、描述一下你理解的渲染管线
2、透明物体的渲染,介绍一下你熟悉的OIT方案
3、phong模型和blinn-phong模型
4、延迟渲染,延迟渲染为什么不支持MSAA,延迟渲染面对多点光源场景时压力也很大,有哪些优化方案?
5、法线贴图,描述一下切线空间,切线空间是怎么定义的?法线是怎么从切线空间变换到世界空间的
6、介绍一下early-z和z-prepass
7、解释一下什么叫z-fighting,你提到可以采用reverse-z来缓解,介绍一下reverse-z思想
8、讲一下shaderbuffer的字节对齐,以opengl为例std140和std430标准有什么不同?
9、光栅化阶段在对顶点属性插值时为什么不是直接均匀地插值而是有一个透视矫正插值的过程?
10、uniform、texture和buffer的区别?
11、讲一下PBR理论,cook-torrence BRDF,PBR材质中的金属度属性会影响渲染方程中哪一部分?
12、介绍一下常见的抗锯齿方案
13、介绍一下虚拟纹理技术,好处和代价分别是什么
14、介绍一下常规体渲染的思路,体积云在移动端有什么优化方案?
15、介绍一些常见的GI方案,有了解过UE的lumen吗
16、有哪些常见的遮挡剔除方案
17、shadowmap,常见的软阴影方案
18、向量的叉乘和点乘,假如一个射击游戏是类似CS那种光枪的射击不是发射子弹有弹速的那种,一般是采用射线检测,假设敌人头部就是一个球怎么快速判断射线和球相交呢?
19、什么叫drawcall和overdraw?
20、解释一下渲染过程中的静态合批和动态合批
21、有哪些常见的lod方案呢?如果一个场景中有大量的静态网格体例如一大堆石头你会怎么优化渲染上的性能呢?了解过UE的nanite吗?
UE
1、描述一下UE的gameplay框架
2、描述一下UE的UI框架,slate与UMG
3、解释一下UE的反射机制
4、蓝图和C++是如何交互的
5、UObject的生命周期,UE的GC
6、UE的延迟渲染管线
数据结构与算法
1、讲一下红黑树和AVL树,时间复杂度分别是多少?
2、堆的概念了解吗?堆从概念上是一个树状结构为什么一般实现时底层也是数组呢例如stl中priority_queue?
3、1万条数据中找最大的前100条怎么找
4、哈希冲突有哪些解决方案?unordered_map是怎么做的
5、内存只有128m要对1g的数据进行排序选择什么算法
6、(手撕)链表倒数第k个节点
7、(手撕)判断链表是否有环
8、(手撕)LRU
操作系统、计网
1、进程和线程的区别,切换进程的成本为什么比切换线程高?
2、虚拟内存思想,什么叫缺页中断,如果一台8g内存的机器有一个进程请求16g内存能成功吗?
3、什么叫内存碎片,讲一下内存池的思想
4、进程间的通信方式
5、死锁的四个条件,解除(预防)死锁的方法
6、HTTP的get和post有什么区别
7、TCP和UDP,TCP为什么要三次握手四次挥手
8、KCP,为什么不直接用TCP而是要自己在应用层实现可靠传输,KCP解决了TCP的哪些问题?
9、如果让你使用UDP自己在应用层实现一套可靠传输方案,需要做什么
10、网络游戏的帧同步和状态同步,帧同步的断线重连和中途加入怎么处理?
设计模式
1、MVC MVP MVVM
2、以UI场景为例MVVM有一个问题,假设某个绑定变量被某个控件绑定了,同时这个变量又是一个例如table或结构体下的成员,那么这个变量变化时不止会带动绑定的控件更新,也可能带动绑定这个table或结构体的控件产生不必要的更新,这种情况下怎么处理呢?
3、了解ECS架构吗?为什么要用ECS架构?ECS的开销又有哪些?
4、单例模式、工厂模式、观察者模式
一些场景问题
1、假设游戏场景中有一面大屏幕会随机播放一些视频,理论上来说这个随机播放视频的序列和视频播放进度等应该由服务器来计算决定,但现在我们就考虑说服务器不做这个决定,你在客户端角度怎么设计来实现让在这个场景中的玩家看到的视频及播放进度是相同的呢?视频播放完毕后随机播放下一个时又怎么让所有玩家随机到的是同一个呢?断线和中途加入又怎么处理呢?
2、如何仅用互斥锁来实现一个控制多线程并发读写文件的控制类呢?例如写一个类向外暴露四个函数开始读、开始写、结束读、结束写。你这种思路会不会让写者饥饿呢?怎么优化?
3、假设游戏里有一个闹钟功能,玩家可以定某个时间点的闹钟,这个闹钟会存到服务端,到点了玩家就会收到闹钟提醒,你在服务端怎么设计这个闹钟的底层数据结构呢?
4、一个抽卡游戏,假设一张卡有n种属性,对每张卡抽卡时单种属性不能超过x且属性值总和不能超过y,其中n * x可能是大于y的,在不能抽完再判定是否合规再重抽的情况下(即只能抽一次)你怎么设计一种算法保证玩家抽出的卡是均匀的?
5、C++怎么实现一个单例类?
6、实现一个计时器类,有一个task类提供一个excute接口,计时器类可以接受多个task以及每个task一个timeout,计时器类提供一个update函数每帧传入一个deltatime,在task对应的timeout消耗完后就执行excute。你这个实现各个部分的时间复杂度是多少?如果task的excute函数内又添加了新的task,可能会出什么问题?
7、实现一个对象池,就以子弹为例吧每个子弹有位置xyz和direction以及速度等属性,考虑动态扩容缩容和多线程。
一些AI相关的问题
1、平时用什么harness工具?用什么模型?为什么喜欢用cli而不是gui?
2、面对长程开发任务,即使现在前沿大模型1m上下文也不能完全容纳整个开发流程,你有什么经验面对上下文压缩等问题呢?
3、平时用AI时会关注花费吗?有什么节省token的思路吗?面对不同任务你会如何选择合适的模型呢?
4、除了编码以外,还在哪些场景应用AI呢?有用过一些MCP工具吗?有沉淀过一些skill吗?
5、如果80%甚至更高比例的代码都由AI产出了,你怎么验收AI产出的代码呢?在你去年的实习经历中,去年可能vibe coding还没有太普及,你现在回顾的话有没有什么可以交给AI的工作呢?
6、你会关注AI产出代码的可读性问题吗?你怎么保证AI产出代码的可读性呢?你觉得AI在编码方面有什么天然的不足?
本篇目录
当前问题0196
- 01
sizeof和strlen的区别
- 02
const关键字,const int* p,int* const p有什么区别
- 03
static关键字
- 04
explicit关键字,什么情况下应该禁止隐式类型转换
- 05
结构体字节对齐
- 06
define inline typedef
- 07
四种类型转换
- 08
dynamic_cast的底层原理,实例的type_info存在哪的
- 09
多态是怎么实现的
- 10
虚指针和虚函数表
- 11
类的初始化顺序,考虑虚继承、多重继承情况下呢?类成员的初始化顺序和初始化列表顺序有关系吗?
- 12
基类的析构函数为什么应该声明为虚函数
- 13
虚继承解决什么问题
- 14
深拷贝和浅拷贝
- 15
纯虚函数本身可以有实现吗?
- 16
类的成员模板函数可以是虚函数吗?
- 17
构造函数可以是虚函数吗?
- 18
构造函数可以调用虚函数吗?
- 19
三种智能指针
- 20
shared_ptr是不是线程安全的?shared_ptr的控制块在内存的什么位置?
- 21
malloc free new delete
- 22
delete[]怎么知道需要释放多少内存的
- 23
vector的扩容机制,push_back和emplace_back的区别
- 24
vector迭代器在什么场景下会失效
- 25
右值引用和移动语义
- 26
C++的内存分区
- 27
在析构函数中delete this会发生什么
- 28
为什么析构函数不应该抛异常?
- 29
(int)0.1和(int)-0.1的结果为什么都是0?
- 30
Lua table有两个遍历方法ipairs和pairs有什么区别,如果table中既有数组部分又有哈希部分ipairs遍历结果是什么?
- 31
Lua怎么实现面向对象?Lua中各个元方法的意义?
- 32
Lua的GC
- 33
Lua的协程
- 34
Lua的热更新流程
- 35
描述一下你理解的渲染管线
- 36
透明物体的渲染,介绍一下你熟悉的OIT方案
- 37
phong模型和blinn-phong模型
- 38
延迟渲染,延迟渲染为什么不支持MSAA,延迟渲染面对多点光源场景时压力也很大,有哪些优化方案?
- 39
法线贴图,描述一下切线空间,切线空间是怎么定义的?法线是怎么从切线空间变换到世界空间的
- 40
介绍一下early-z和z-prepass
- 41
解释一下什么叫z-fighting,你提到可以采用reverse-z来缓解,介绍一下reverse-z思想
- 42
讲一下shaderbuffer的字节对齐,以opengl为例std140和std430标准有什么不同?
- 43
光栅化阶段在对顶点属性插值时为什么不是直接均匀地插值而是有一个透视矫正插值的过程?
- 44
uniform、texture和buffer的区别?
- 45
讲一下PBR理论,cook-torrence BRDF,PBR材质中的金属度属性会影响渲染方程中哪一部分?
- 46
介绍一下常见的抗锯齿方案
- 47
介绍一下虚拟纹理技术,好处和代价分别是什么
- 48
介绍一下常规体渲染的思路,体积云在移动端有什么优化方案?
- 49
介绍一些常见的GI方案,有了解过UE的lumen吗
- 50
有哪些常见的遮挡剔除方案
- 51
shadowmap,常见的软阴影方案
- 52
向量的叉乘和点乘,假如一个射击游戏是类似CS那种光枪的射击不是发射子弹有弹速的那种,一般是采用射线检测,假设敌人头部就是一个球怎么快速判断射线和球相交呢?
- 53
什么叫drawcall和overdraw?
- 54
解释一下渲染过程中的静态合批和动态合批
- 55
有哪些常见的lod方案呢?如果一个场景中有大量的静态网格体例如一大堆石头你会怎么优化渲染上的性能呢?了解过UE的nanite吗?
- 56
描述一下UE的gameplay框架
- 57
描述一下UE的UI框架,slate与UMG
- 58
解释一下UE的反射机制
- 59
蓝图和C++是如何交互的
- 60
UObject的生命周期,UE的GC
- 61
UE的延迟渲染管线
- 62
讲一下红黑树和AVL树,时间复杂度分别是多少?
- 63
堆的概念了解吗?堆从概念上是一个树状结构为什么一般实现时底层也是数组呢例如stl中priority_queue?
- 64
1万条数据中找最大的前100条怎么找
- 65
哈希冲突有哪些解决方案?unordered_map是怎么做的
- 66
内存只有128m要对1g的数据进行排序选择什么算法
- 67
(手撕)链表倒数第k个节点
- 68
(手撕)判断链表是否有环
- 69
(手撕)LRU
- 70
进程和线程的区别,切换进程的成本为什么比切换线程高?
- 71
虚拟内存思想,什么叫缺页中断,如果一台8g内存的机器有一个进程请求16g内存能成功吗?
- 72
什么叫内存碎片,讲一下内存池的思想
- 73
进程间的通信方式
- 74
死锁的四个条件,解除(预防)死锁的方法
- 75
HTTP的get和post有什么区别
- 76
TCP和UDP,TCP为什么要三次握手四次挥手
- 77
KCP,为什么不直接用TCP而是要自己在应用层实现可靠传输,KCP解决了TCP的哪些问题?
- 78
如果让你使用UDP自己在应用层实现一套可靠传输方案,需要做什么
- 79
网络游戏的帧同步和状态同步,帧同步的断线重连和中途加入怎么处理?
- 80
MVC MVP MVVM
- 81
以UI场景为例MVVM有一个问题,假设某个绑定变量被某个控件绑定了,同时这个变量又是一个例如table或结构体下的成员,那么这个变量变化时不止会带动绑定的控件更新,也可能带动绑定这个table或结构体的控件产生不必要的更新,这种情况下怎么处理呢?
- 82
了解ECS架构吗?为什么要用ECS架构?ECS的开销又有哪些?
- 83
单例模式、工厂模式、观察者模式
- 84
假设游戏场景中有一面大屏幕会随机播放一些视频,理论上来说这个随机播放视频的序列和视频播放进度等应该由服务器来计算决定,但现在我们就考虑说服务器不做这个决定,你在客户端角度怎么设计来实现让在这个场景中的玩家看到的视频及播放进度是相同的呢?视频播放完毕后随机播放下一个时又怎么让所有玩家随机到的是同一个呢?断线和中途加入又怎么处理呢?
- 85
如何仅用互斥锁来实现一个控制多线程并发读写文件的控制类呢?例如写一个类向外暴露四个函数开始读、开始写、结束读、结束写。你这种思路会不会让写者饥饿呢?怎么优化?
- 86
假设游戏里有一个闹钟功能,玩家可以定某个时间点的闹钟,这个闹钟会存到服务端,到点了玩家就会收到闹钟提醒,你在服务端怎么设计这个闹钟的底层数据结构呢?
- 87
一个抽卡游戏,假设一张卡有n种属性,对每张卡抽卡时单种属性不能超过x且属性值总和不能超过y,其中n * x可能是大于y的,在不能抽完再判定是否合规再重抽的情况下(即只能抽一次)你怎么设计一种算法保证玩家抽出的卡是均匀的?
- 88
C++怎么实现一个单例类?
- 89
实现一个计时器类,有一个task类提供一个excute接口,计时器类可以接受多个task以及每个task一个timeout,计时器类提供一个update函数每帧传入一个deltatime,在task对应的timeout消耗完后就执行excute。你这个实现各个部分的时间复杂度是多少?如果task的excute函数内又添加了新的task,可能会出什么问题?
- 90
实现一个对象池,就以子弹为例吧每个子弹有位置xyz和direction以及速度等属性,考虑动态扩容缩容和多线程。
- 91
平时用什么harness工具?用什么模型?为什么喜欢用cli而不是gui?
- 92
面对长程开发任务,即使现在前沿大模型1m上下文也不能完全容纳整个开发流程,你有什么经验面对上下文压缩等问题呢?
- 93
平时用AI时会关注花费吗?有什么节省token的思路吗?面对不同任务你会如何选择合适的模型呢?
- 94
除了编码以外,还在哪些场景应用AI呢?有用过一些MCP工具吗?有沉淀过一些skill吗?
- 95
如果80%甚至更高比例的代码都由AI产出了,你怎么验收AI产出的代码呢?在你去年的实习经历中,去年可能vibe coding还没有太普及,你现在回顾的话有没有什么可以交给AI的工作呢?
- 96
你会关注AI产出代码的可读性问题吗?你怎么保证AI产出代码的可读性呢?你觉得AI在编码方面有什么天然的不足?