腾讯游戏开发实习面试经验分享

Viewed 114

腾讯游戏开发实习面试经验分享,可能有特例情况的存在,欢迎大佬们补充!

1 Answers

腾讯游戏开发实习面试基本都在4轮以上:笔试——现场/电话面试——HR面试

如果是技术美术(TA)向的岗位可能会问到问题:

1、如果面试的项目组是用Unity开发的,会简单询问简历中Unity的项目;使用UE系列开发的项目组同理。

2、物体阴影的演算与效果实现。

  • 阴影映射(Shadow Mapping)、阴影体积(Shadow Volumes)等常见技术,需要准备好解释原理、优缺点以及在实际项目中的应用。

3、Phong光照模型,以及Blinn-Phong的优点和缺点。

  • Phong模型用于模拟物体表面的光照效果,Blinn-Phong是它的改进版。需要解释这两个模型的原理,以及Blinn-Phong在计算性能上的优势和在视觉效果上的局限性。

4、光栅化相关问题。

  • 光栅化是将3D场景转换为2D图像的过程,面试可能会涉及到像素填充、抗锯齿、深度缓冲等细节问题。

5、C++多态实现的原理?

  • 多态性通过虚函数表(vtable)实现。面试中可能要求解释vtable的工作机制以及如何通过它实现函数调用的动态绑定。

6、移动语义的好处是什么?

  • 移动语义在C++中能显著提高程序性能,特别是在对象的资源管理上,避免了不必要的复制操作。

7、如何在Lamda中传值or传引用?

  • 需要知道如何在C++的Lambda表达式中使用捕获列表来传递变量,无论是通过值传递还是引用传递。

8、多线程编程的经验。

  • 可能会被问到多线程编程中的经验,特别是在同步、死锁避免、线程安全等方面的实践。

9、协程异步移动相关问题。

  • 会涉及到协程的基本概念以及如何在实际项目中实现异步操作。

10、shadowMap可能出现的问题。

  • ShadowMap技术常见的问题包括锯齿效应(Aliasing)、伪影(Artifacts)、精度不足等

11、移动端的渲染管线与主机的的区别。

  • 移动端由于硬件限制,在渲染管线的处理上会有简化,面试可能会涉及到这方面的优化策略。

12、vector的push_back的时间复杂度。

  • 一般情况下,push_back操作是O(1),但是当需要扩展内存时,复杂度为O(n)。

13、组合和继承的区别有什么各自优缺点。

  • 组合更灵活、维护成本低,继承则能更好地体现“is-a”关系,但可能会导致代码耦合度高。

14、实现骨骼蒙皮动画的底层。

  • 骨骼动画的基本实现原理,如何通过矩阵变换实现模型的骨骼变形。

15、渲染管线中的坐标变换流程。

  • 从模型坐标到屏幕坐标的转换过程,包括模型、视图、投影矩阵的应用。

16、透视除法的意义。

  • 透视除法是将齐次坐标系中的点转换为3D空间中的点,确保远处物体看起来更小,从而模拟透视效果。

17、投影矩阵的推导过程。

18、用递归实现链表的大数加法。

  • 要能讲清楚递归的思路和基线条件。

一些Unity引擎的技术问题:

1. Unity Set Pass Call是什么?
Set Pass Call 是 Unity 引擎在绘制物体时,将对应的 Shader 和相关参数装载到 GPU 流水线上的操作。每次切换 Shader 时,都会触发 Set Pass Call,这个过程会带来一定的性能开销。

为了优化性能,应该尽量减少 Shader 的切换,使用统一的 Shader 并缓存常用的 Shader 到内存中,这样可以减少 Set Pass Call 的频率,提升渲染效率。

2. Unity DrawCall是什么?
DrawCall 是 Unity 引擎在绘制场景时,将物体的渲染指令提交给 GPU 的过程。每一次 DrawCall 都代表着一次提交。场景中物体越多,提交次数就越多,DrawCall 数量就越大。

3. 降低DrawCall对性能提升的意义是什么?
降低 DrawCall 的数量,可以减少 CPU 向 GPU 提交数据的次数,这样能减少性能开销,提升整体渲染效率。减少 DrawCall 数量可以让 GPU 一次性处理更多的渲染任务,充分发挥其性能潜力,尤其在移动设备上,降低 DrawCall 是优化性能的关键。

4. Unity 是单线程还是多线程的?
Unity 引擎本身是多线程的,但大部分开发工作是在主线程(Main Thread)中进行的。Unity 内部有两个主要线程:主线程负责业务逻辑、物理引擎、Mono 代码等,而渲染线程(Render Thread)负责将渲染数据提交给 GPU。

也可以自行使用多线程来处理一些独立的任务,比如网络通信、数据处理等,但要注意,Unity 中大部分 API 只能在主线程中调用。

5. Unity有哪些合批方式可以降低DrawCall?
Unity 提供了三种主要的合批方式来降低 DrawCall 数量:

  • 静态合批: 适用于静态物体,将多个静态物体合并为一个网格进行渲染。
  • 动态合批: 适用于移动物体,在满足一定条件下,将多个物体合并为一个批次提交。
  • GPU 实例化: 适用于大量重复的物体,通过 GPU 实例化技术,只需要一个 DrawCall 就可以渲染多个实例。

6. Unity 如何分析内存占用?
要分析 Unity 项目的内存占用,可以使用 Unity 的 Profiler 工具。Profiler 可以详细显示各个模块的内存使用情况,找出内存消耗的热点,并针对性地进行优化。

7. Unity 如何分析性能热点?
通过 Unity 的 Profiler 工具,可以分析项目中的性能瓶颈。Profiler 可以显示函数调用的时间占比、调用次数等信息,识别和优化性能热点,提升项目的运行效率。

8. Unity如何查看当前场景的DrawCall?
要查看当前场景的 DrawCall 数量,可以使用 Unity 编辑器中的 Stats 面板或 Profiler 工具。Stats 面板会显示当前场景的 DrawCall 数量,而 Profiler 则可以更详细地分析 DrawCall 的来源和性能影响。

协作类问题:

1. Unity项目开发中程序如何愉快的与策划沟通?
在游戏开发中,策划常常希望能方便地调整游戏中的数值、规则,并能立即看到修改的效果,而不需要每次都麻烦程序员。为了满足策划的需求,可以提供一些工具,比如:

  • 行为决策树编辑工具: 让策划能够自己调整怪物AI的行为和决策,减少反复沟通的时间成本。
  • 数值策划表: 提供方便的数值编辑工具,让策划能够直接修改游戏中的数值,比如角色属性、技能伤害等,随时调整平衡性。
  • 地图编辑器: 在Unity中开发一个好用的地图编辑器,让策划可以直接参与地图的制作和调整,大大提高工作效率。

2. Unity项目开发如何避免多人开发时的提交冲突?
多人开发Unity项目时,提交代码和资源时可能会发生冲突,特别是在多人同时修改同一场景或资源的情况下。为了减少冲突和方便解决冲突,可以采取以下措施:

  • 代码冲突: 代码文件是文本格式,冲突较容易解决。使用版本管理工具(如Git)进行代码合并,大多数情况下工具能自动处理冲突,实在不行,人工介入解决也相对简单。

  • 场景冲突: 场景文件不是纯文本,合并冲突时较为麻烦。解决的办法是尽量避免多人同时修改同一场景。可以将场景中的内容分成多个预制体,每个人负责一个预制体,这样即使需要修改,同一时间也是在不同的预制体上工作,减少了冲突的机会。

  • 避免直接挂载代码: 不要直接将代码挂载在场景节点上,这样会导致合并时难以解决的冲突。所有逻辑都应通过代码控制,尽量减少与场景结构的绑定。