腾讯 游戏客户端 面经
转眼又到了暑期实习招聘的时间,分享一下去年的面经。希望对大家有帮助
工作室A
一面
- 图形学中常见的光照模型
- 描述一下blinn-phong光照模型
- 有没有学过ue
- 有没有使用过unity的动画系统和物理系统
- 有没有了解过动画系统的物理系统的原理
- 虚函数的原理
- 虚函数表存储在哪里
- 虚函数指针存储在哪里
- 构造函数能声明为虚函数吗? 析构函数呢
- 内存对齐
- 手撕: 如果链表有奇数个结点点, 反转中间结点的前面部分和后面部分, 如果有偶数个结点, 分别反转前半部分和后半部分.
- 红黑树的原理
- 哈夫曼编码
- 如何实现一个轻量的可靠UDP
- 有没有使用过多线程编程
二面
- C++有几年使用经验
- C++是怎么学习的? 学校里的课程还是自学的
- 课外的话通过什么书籍学习的C++
- STL了解到什么程度, 知道智能指针吗
- 还了解C++的其他内容吗
- 知道哪些高级数据结构
- 非线性的数据结构知道哪些
- 树和图的遍历方式
- 喜欢什么类型的游戏
- 最擅长的游戏
???
- 擅长到什么程度
???
- 实习的目的
- 具体想提升哪些方面的技术
- 实习只有3个月, 你说的这些学不完
???
- C++类的大小由什么决定
- C++类的内存模型
- 多重继承的虚函数表指针的数量由什么因素决定
- 虚继承
- 在构造函数中可以调用虚函数吗
- 虚表指针的赋值时机?
- 虚表是什么时候生成的
- 虚表存储的位置
- 内存对齐的规则
手撕
无重复最长字串
工作室B
一面
- 一个类中有一些成员变量, 如何确定这个类的大小
- 如果类中添加了静态成员变量,函数,虚函数呢
- 虚函数指针的作用
- 如果一个派生类重写了基类的虚函数, 虚函数表会有什么变化
- 析构函数为什么要是虚函数
- 如果不通过delete, 而是离开作用域时自动销毁, 会调用派生类的析构函数吗
- C++内存模型
- 堆和栈的区别
- 如果自己实现一个vector, 你会怎么考虑
- 进程和线程
- 进程访问的内存地址是实际的真实的内存地址吗
- 线程访问其所属进程的内存地址时有什么限制, 可以跨线程访问栈空间吗?
- 可以访问堆内存
- 栈访问风险 共享所有内存, 每个线程都有独立的栈空间, 不应该跨线程访问栈, 因为其他线程的栈可能随时被修改, 直接访问可能导致数据不一致.
- 同步问题 多个线程同时修改同一全局变量或堆内存时, 需通过锁或原子操作保证数据的一致性
- 多个线程同时访问一个变量时产生竞争条件怎么解决尝试获取被占用的互斥锁, 进入阻塞, 等待锁释放
- 线程尝试获取被占用的互斥锁进入什么状态(阻塞)
- 死锁产生的条件
- 互斥条件(Mutual Exclusion):一个资源在同一时间只能被一个线程或进程占用。
- 占有且等待条件(Hold and Wait):一个线程或进程在持有至少一个资源的同时,仍然尝试获取其他线程或进程所持有的资源。
- 不可抢占条件(No Preemption):资源不能被强行从一个线程或进程中抢占,只能由占有它的线程或进程主动释放。
- 循环等待条件(Circular Wait):存在一个线程/进程等待序列,其中每个线程/进程都在等待下一个线程/进程所持有的资源。
- 有没有了解过UE
- 从设计角度看为什么GameMode只存在服务器,GameState存在所有客户端
- 图形渲染管线
算法
- 无重复最长字串
- 表达式计算 + - * /
二面
- 在游戏开发中喜欢做哪方面的内容
- 以后是想往gameplay方向发展吗
- C++中调用普通函数和调用虚函数在性能上有什么区别普通成员函数在编译时已经确定地址, 调用直接通过函数地址执行(如果函数简单直接被内联优化)虚函数调用需要先获取虚表指针, 找到虚函数表, 再从虚函数表中找到对应的函数地址
- 虚函数表存在哪个区常量区,只读数据段
- 类的实例中会存储虚函数表吗
- 虚函数指针是什么时候确定的
- 虚表是什么时候确定的
- 构造函数可以为private吗
- 两个没有关系的类能互相转换吗不能, 需要在类中实现对应的类型转换运算符
- 指针的大小
- new和malloc的区别
- C++中是否可以先分配内存, 再在已分配的内存里进行构造对象(placement new)
- vector和map以及unordered_map
- 在插入10000个数据时, 上面三个结构的内存大小和布局是怎样的
- 以上三种数据结构的查找时间复杂度
- 哈希表扩容的原因
- 如何判断一个圆形技能可能击中哪些敌人
- 如果敌人在移动而且分布不均匀要怎么解决
- 如果敌人全在某个点上呢
- 如果在2D平面内有很多小球, 如何处理小球之间的碰撞
- 有不使用包围盒的方案吗
- 半透明物体的渲染, 透明物体渲染时要进行深度写入吗
- 线程执行的顺序是确定的吗
- 如何使线程按照一定的顺序执行 (条件变量)
- 线程之间如何通信
- 使用信号量和全局变量来进行通信有什么区别
- 全局变量: 忙等待
- 信号量: 阻塞
- 可以使用一个锁来使两个线程按照顺序执行吗
- cache是什么, 实际程序中怎么利用cache
看代码回答问题
- 引用/指针相关
- 内存对齐相关, 给定类结构回答类的大小
- 虚函数相关
- 内存分配相关 栈/堆
- 深拷贝/浅拷贝, 移动构造函数
手撕
实现一个程序, 要求给定学生姓名能够立即得到其年龄, 不能使用任何STL容器, 但可以自己实现(前缀树/哈希表).
三面
- 项目相关
- 子弹的命中是怎么实现的
- 讲一下shadowmap的原理
- 如何优化静止的物体的shadowmap
- 静止物体的shadow和运动物体的shadow怎么叠加
