【程序人生】盛趣游戏 U3D 面经(已拿 offer )

2020秋招,有幸拿到了盛趣游戏公司的 U3D 开发的 Offer。

面试共有两面,技术面试和HR面。

话说我一开始以为至少也有两轮技术面吧,于是第一轮技术面通过后,我在牛客上连着刷了一周的题目,C++,C# 基础,数据结构,算法,计算机网络,操作系统原理等等,刷了一千多题。结果,第二轮面试,我信心满满的打开视频面试链接时,对面居然是一个可爱而漂亮的小姐姐,然后告诉我这是 HR 面。。。内心,,,然后就通过了,,,,感觉白准备那么久了。。。

好了,趁着时间还没太久,还有些印象,把技术面中问的问题尽量回忆整理一下,方便后来人。

(可能有些问题遗漏了不全,以后如果回想起来了,有时间再补充吧)


面试官:做一下自我介绍

我:面试官你好,我叫机灵鹤,是实习时长两年半的个人编程员,爱好 C++,C#,U3D,和 Python 。 实习期间做了balabala项目,会pipipapa技能,现在希望找一份 U3D 游戏开发的工作。

面试官:你做了这么多项目,挑一个你最满意的项目介绍一下。

我:简单介绍了一下项目,包括项目做什么的,有哪些特色功能,我在项目中主要参与的部分,项目中遇到的难点和解决办法(这个确实得提前准备准备,因为一定会问到,找一个有点难度的,自己又参与过,对细节足够了解的项目,并且总结几点你解决了的,听上去有些挑战性的,能够体现你能力的难点)。

面试官:你在项目中遇到了哪些有挑战性的难点?

我:我认为主要有两个方面, 1. UI 的制作,因为这个项目是对一个物理实验的VR仿真模拟,而实验中需要用到一款专门配套的电脑软件,于是我在 Unity3D  中用 UGUI 把这款软件的所有界面,所有的操作逻辑,以及数据处理部分都比较完美的还原出来了,并在此基础上用图表对实验数据和结果进行可视化展示。2. 性能优化,由于是 VR 类项目,FPS 需要优化到 60 以上才能基本没有卡顿感,所以经过一系列优化措施之后,项目由最开始的 20 FPS 左右,提升到了 60FPS 左右。

(这两块确实都是我实实在在参与过的内容,UI 制作虽然好像不值一提,但是至少这样可以给面试官一个讯息,我亚索 ,啊呸,我 UGUI 贼溜)

面试官:性能的优化方面用了哪些方式?

我:主要分为以下几个方面。1. 模型,主要是让美术团队帮忙优化,删除多余的顶点和面,适当降低模型精度等。2. 光照,使用烘焙代替实时光,以及在不显著影响视觉效果的情况下,降低光照质量。3. 材质贴图尺寸尽量为 2 的 n 次方,使用 MipMap 来优化渲染效率。4. 尽量少用透明 shader,尤其是粒子的,因为那样对性能的消耗非常大。5. 使用 LOD 技术,以及遮挡剔除技术,减少需要渲染的模型的面数。6. 调整相机的远近剪裁面以及 FOV 等等。(这块我正好最近在研究,比较熟悉)

面试官:既然你用过 MipMap,那你谈一谈它是什么一个原理,有哪些优点和缺点。

我:MipMap 是类似于金字塔一样,对原始的贴图进行处理,生成多种不同精度尺寸的贴图,远景使用低精度贴图,近景使用高精度贴图,这样可以提高模型的渲染效率。缺点的话,就是它采用的是 “以空间换时间” 的策略,需要额外空间来存储不同精度的贴图。

面试官:那它需要多少的额外空间呢?

我:不到两倍吧(具体多少我也没算过,面试官听着不对,让我说计算细节),我说原始图的面积算作 1 的话,第一层的图长宽为1/2,面积是1/4,上一层的面积都是下一层的 1/4,所以计算就是 1 + 1/4 + 1/16 + 1/64 + 。。。(这个没口算出来,但方法是对了,然后面试官说,大概需要 1/3 的额外空间)

面试官: Unity3D 中如何用脚本获取组件?能不能在 Update 函数中获取组件?为什么?

我:使用 GetComponent<组件名>() 来获取组件,由于这个操作是比较耗性能的,所以尽量在 Update 之外获取,然后 Update 里直接使用获取到的对象。

面试官:Unity3D 中的 Update ,FixedUpdate,LateUpdate 有什么区别?分别适用于什么样的情况?

我:(这个我正好准备过)Update 是每帧执行一次,与机器性能有关;FixedUpdate 是固定时间间隔的,和机器性能无关;LateUpdate 是在其他两种 Update 执行完之后在执行的。使用的话,游戏逻辑控制适合用 Update,物理引擎计算这些适合用 Update,LateUpdate 适合放相机运动的脚本。

(这些都是比较细节的 Unity3D 的知识点了,真的,不难,但是如果对 Unity3D 不熟悉的,还真不一定答得上来)

面试官:C# 中的装箱和拆箱?

我:不会(面试官让我试着回答一下,我试着回答了一下,后来网上一查,果然说错了)

面试官:C# 中重载(overload)和重写(override)的区别。

 我:这个明明会的,结果当时一下懵了以为是什么新奇的玩意儿,没答出来,后来上网查的时候,真想抽自己一嘴巴子。

面试官:了解 OpenGL 吗?说一说冯氏光照模型有哪些部分组成?

我一开始没反应过来,说不知道,后来才反映过来原来问的是Phong 模型(都怪之前老师的发音,听了几年的 “丰格” 模型,突然听到说 “冯氏模型”,一下没听出来),然后我跟面试官解释,说上一个问题我知道。。。。

我:冯氏光照模型是一种局部光照模型,只考虑了光源对物体的影响,没有考虑物体之间相互的影响。它包含了三个部分,全局光,散射光和反射光。。。(准确的说应该是,环境光,漫反射光,和镜面反射光,不过我感觉一个意思,面试官也没有细扣,直接下一个问题了)

面试官:在一个单链表中,如何判断是否有环?

我:我想到两种方法,第一种,对链表遍历的同时,记录已访问过的结点,如果遍历过程中发现有结点是此前已经访问过的结点,说明有环;第二种方法,快慢指针法,快指针每次前进两个,慢指针每次前进一个,如果快慢指针相遇了,说明有环。

面试官:排序算法里,快速排序时间复杂度多少,稳不稳定?冒泡排序呢?插入排序呢?

(排序算法的时间复杂度,空间复杂度,和稳定性,常见的几种排序算法都得记住啊,这是基础啊)。

我:快排复杂度是 nlogn,不稳定,插入排序和冒泡排序,复杂度都是 n^2 ,都稳定。

(还好我面试前几天刚整理了排序算法的知识,八大排序算法分析和比较,关于稳定性,也有一个口诀,“最近情绪不稳定(快速排序)(希尔排序)(直接选择排序)(堆排序)朋友聊聊天”)

面试官:你什么问题想问我的吗?

我问了几个自己感兴趣的问题,然后愉快的结束了面试。总共耗时 40 分钟左右。


总体来讲,面试难度不大,但是考察的很细节,范围也算是比较广吧,从数据结构,到算法,到编程语言,到计算机图形学,到 Unity3D 细节,到项目经验,真的是比较全面了吧。

 

此外,必须要说的一点是,我面试的很多家公司里,他家是第一个注意到我说的

           “实习时长两年半”

这句话,并且意识到 “ 相比于其他应届毕业生,我的 Unity3D 使用经验更加丰富” 这一点的。

哈哈哈,就像是暗示了这么久,终于有人懂我了一样,那种感觉,必须给个赞!!

相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页