2025暑期实习游戏开发/Unity开发/VR开发面经总结
面试公司: 腾讯、字节跳动、阿里淘天、阿里高德、网易雷火、快手、小腾汽车
投递岗位: 游戏客户端开发(腾讯、字节跳动、网易雷火、快手);VR/Unity开发(阿里淘天、小腾汽车);图形学算法(阿里高德)
说明: 面经按照问题类别分类,不按公司分类。有些问题可能引自我的个人项目,会标明。
C++:
- 虚函数/虚继承
- C++虚函数机制?
- 虚表指针存放在哪儿?存放在实例化对象内什么位置?为什么要存放在这个位置?
- C++虚继承机制?虚继承用于解决什么问题?
- 构造函数可以是虚函数吗?
- 析构函数可以是虚函数吗?
- 析构函数非虚会有什么问题?
- 智能指针:
- 介绍C11的新智能指针
- shared_ptr循环引用怎么解决?
- 看过shared_ptr源码吗,shared_ptr的底层机制介绍一下?
- shared_ptr是否是线程安全的?为什么?
- 如何自己实现一个shared_ptr?
- 内存对齐:
- C++内存对齐规则(一般会给例子计算一个struct或class的大小)
- 为什么要内存对齐?
- 强制不内存对齐场景?如何强制不内存对齐?
- class增加函数是否影响class的大小?为什么?
- Enum和Union
- 内存管理
- C++内存管理机制?
- new的对象放在内存什么分区?
- 如何强制new的对象在栈中?
- C++内存泄漏?如何检测内存泄漏?
- 如何避免内存泄漏?
- C++野指针?如何检测野指针?
- 栈溢出?什么情况下会栈溢出?
- STL
- vector和list的差距?哪些场景是否vector?哪些场景适合list?
- push_back和emplace_back的差距?
- map和unordered_map的差别?
- vector是否线程安全?
- 什么情况下STL迭代器会失效?
- 杂项
- static关键字用法
- const关键字用法
- C++编译过程?链接主要做了哪些工作?
- 什么是指针?什么是引用?指针和引用区别?
- 左值和右值?左值引用和右值引用?
- move函数?运用场景和作用是什么?
- 浅拷贝与深拷贝?怎么实现浅拷贝?
- C++有哪些锁?有什么应用场景?
- C11有哪些新特性?
三维引擎:
- Unity各个文件夹干什么用的?
- Monobehavior生命周期
- Unity物体的数据存储在哪里?
- .NET垃圾回收机制?
- Godot和Unity有什么不同?(项目相关)
- Godot有什么独特之处?你为什么选择Godot做开发?(项目相关)
计算机基础:
- TCP&UDP相关
- TCP和UDP是什么?两者区别?
- 详细说说TCP三次握手?三次握手每次握手丢包会怎么样?
- TCP保证可靠通信的方法?
- 如何设计使得UDP实现可靠通信?
- HTTP协议不同版本之间的差距?
- Socket通信底层用TCP还是UDP?Socket通信有什么好处?
- 进程、线程、协程的定义、区别及应用场景。
- 并发和并行有什么区别?
- 什么是虚拟内存,有什么好处?
- 32位系统最大虚拟内存?64位系统最大虚拟内存?windows操作系统支持的最大虚拟内存?
- 介绍常见设计模式?
- 堆排序?
- 快速排序什么情况达到最差?最差时间复杂度?
- 稳定排序算法的定义?有哪些经典排序算法是稳定?
- 常见寻路算法?A* 算法?
- 红黑树?
- 哈希散列表,散列表需要注意哪些问题?
计算机图形学:
- 渲染管线相关:
- 基本渲染管线?
- 视锥剔除在渲染管线的哪个阶段?
- 光栅化具体做什么的?
- 透明物体渲染?
- 顶点坐标包括哪些数据?
- 知道顶点着色器和片元着色器吗?它们的作用都是什么?
- 正交投影和透视投影?如何实现近大远小?
- 知道四元数吗,它相比旋转矩阵和欧拉角有什么优势?
- 如何保证物体的平滑旋转?
- 我有一个正方形纹理,我想要把他变成圆形的,怎么办?
- 什么是DrawCall,为什么要减少DrawCall?
- MVP矩阵及其具体含义作用?
- 什么是mipmap?mipmap的作用是什么?如何确定mipmap的层级?
- 纹理映射方法有哪些?各向异性采样的应用场景?
- 介绍一下骨骼动画?(项目相关)
- GI是什么?Godot引擎有什么实现GI的方式(项目相关)
- 怎么实现水面波动效果?(项目相关)
- 怎么实现AO效果?动态AO效果怎么实现?(项目相关)
场景题:
- 设计一个排行榜,排行榜可能包括不同维度(网易雷火)
- 有一个天平,你可以自由设计砝码的重量,如何使用尽可能少的砝码数量称出所有重量?如何证明你的设计的正确性?(网易雷火)
- 给一个二维数组,1表示陆地,0表示海洋,二维数组保证只有两块连续的陆地,现在想要在两块陆地之间建一座桥如何确定桥的最短值?(网易雷火)
- 看代码纠错,具体代码已忘记,类似传输文件流解决对齐问题(腾讯)
- 给海量数据,如何获得其中最大的1000个(腾讯)
- 有一个计时器列表,如何设计能最快找到最先会被触发的计时器(腾讯)
- 如何设计能够使vector的中间删除效率变高(腾讯)
- 有一串字符串怎么找到第一个重复的字符(腾讯)
- 调用new和delete时自动加计数和减计数(类似shared_ptr),如何实现?(腾讯)
手撕:
- 实现LRU(腾讯、字节跳动、小腾汽车 Leetcode-146)
- 判断一棵树是否为平衡二叉树(腾讯 Leetcode-110)
- 获取链表的中间结点(腾讯 Leetcode-876)
- 反转字符串中的单词(字节跳动 Leetcode-151)
- 最小路径和(快手 Leetcode-64)
- 设计实现一个单例模式(腾讯)
- 判断一个点是否在三角形内(高德地图)
- 你有两种攻击方式:群攻和单攻,且单攻的攻击力一定比群攻高,已知两只怪物的血量,求最优的攻击方式使得攻击次数最小,要求递归与非递归两种实现方式(网易雷火)