# 前言

如前所述,因为打算开始找工作了。
第一个想要的找的地方,当然是重庆了,不过到处都找不到相应的信息。然后最近又看见 QQ 群里有一个人在发重庆的招聘信息(也就看见这一个重庆的),要求挺高 —— 本科以上,三年以上。因为自己实际工作经验刚 2 年,也是犹豫了一阵,不过看着也没其它招聘信息了,所以就投了试了下,打算先去看看。
所以昨天就投了简历,今天去面试了一下,说来感觉效果挺差的。因为去过了知道,他们要找的是 “精通图形学” 的底层程序,表示做功能的真伤不起 —— 虽然不是不会 (自己之前还是私底下专门研究过些的,毕竟是私底下研究的,没经过 “实践” 的洗礼,所以在大半年时间期间忙于其他逻辑,没空再研究 [接触] 的情况下,果然被时间侵蚀成渣渣了啊),时间长了不用印象就少了,这次面试最最深刻的印象就是:唉?这问题好像有点印象...⊙△⊙?
那么,稍微记录一下吧。

# 简介

昨天本来是上午发过去的简历,结果等到快晚上了,那边才接收,然后说看着不错,有时间去面试。
所以就说,明天(也就是今天了)。
当时交流起来都感觉了累,因为发一条信息,等半天才回一次。
问做什么的,回复说:体感,详情去了再介绍。
后来查了一下公司,原来发招聘信息的直接就是公司老板啊,或许平时都没去上班 —— 所以就没多问了。
然后查了一下之前附在简历上的 Demo 链接,那边也是根本就没看过。

——————————————————————

公司所在的大厦,看着还可以,不过当踏上 1101,也就是公司所在楼层之后,虽然之前就有点心理准备,说实话还是有点失望:旁边好像是一家火锅店,屋子也挺小,还没我现在租房大,加上前台人数貌似还不到 10 个...

然后前台拿了一张纸给我,说是还要填一下简历,让我坐在了靠门那张没人使用的桌子旁,对面还有两张办工桌,好像是坐的两个美术的样子?没大注意,所以记不大清楚了。另外,这张上面包括父母信息都要填,加了一些东西,当然相比我发过去的简历,也少了好些内容。
期间老板出去过一次,好像是抽烟去了... 回来进屋,然后又过了一会儿,出来问我填好了没?
我说好了。

然后他问了下前台,好像是笔试题整理好了没!人来了才开始整理笔试题啊。
貌似还没好,所以就直接把我叫到里边的隔间 —— 大概就是老板或者程序的办公室了 —— 都是用的笔记本,看样子像是比较老的 Thinkpad 型号,性能上应该挺差的,不大可能是用来开发的吧?也不知道是不是自带的。

然后,面试开始了。

# 面试

他们也没叫我把刚才填写的那张纸拿过去,而是打开了笔记本 —— 应该是直接在看我发过去的简历。

里边办工桌做了两个人,是一个方形桌子,推测是程序。
我和其中一个面对面坐着,老板进来坐在了与我们垂直的位置,我旁边则是另一个程序 (大概)。

首先问了下我之前做什么?我说主要是 AI、StoryEditor、动画行为等,游戏功能逻辑方面内容。对面表示知道了。
然后说,自己公司做体感,主要是优化那块儿。

然后,问了第一个问题:

# “剔除有哪几种方式?”

然后我想到了曾经看过的一个插件实现,所以稍微问了一下说,是自己实现的么?他说是,然后我回答说,通过从相机发射射线,碰到的物体使其渲染,反之则不渲染。另外 Unity 本身的话,也自带了一个 “Occlusion Culling” 功能,通过烘焙也可以。
然后他问:是遮挡剔除么?我说是。
问:还有其它方式么?
当时莫名感觉又紧张起来,有感觉上面自己回答不是很好的样子,脑袋白了一下,回答说不大清楚了。(如果不是自己实现,应该还有相机的视锥体剔除,这个是 Unity 已经做过的了)

# “怎么进行光照优化?”

答:我直接就说,最好的方式就是烘焙光照。(可能的话,不使用实时光源或阴影,而用烘焙光照方式代替,因为实时光辉造成跟多的 DC 及渲染消耗。静态场景除了烘焙贴图来优化光照还有什么?修改烘焙分辨率?自己写 Shader,在顶点计算光照?使用光照探针?不过看着对面盯着人,明显表示不够吧?)然后急急地想了下,说最新的 Unity5 用实时光照的话,烘焙 GI 也很好的(哦,我在说什么?)[使用 Forawrd 渲染,尽量少或者不使用像素光照 (即使用顶点光照)]
不了了之...(大概想问的也是图形学某个底层的问题?)

答:Unity 烘焙 Navmesh 的时候,会烘焙成一个平面的模型,里面包含了许多的三角形数据,寻路的时候,通过寻找这些三角形哪些最近,然后把那些三角形内的点连起来,就变成了路径了。就像是 Unity 一个比较著名的插件 “Pathfinding” 一样,里面也有一个 Navmesh 的实现,烘焙的时候,就是自己做成的一个平面的模型。
问:最底层,是怎么实现的?
答:没研究过(Navmesh 用就用了,除了特殊需要,谁还会专门研究最底层的寻路实现啊?虽然我知道一些原理 [难道不是用类似 A 算法先计算出最近的一堆三角形,然后连线?],也说了,不过对面明显不满意)
([想起来... 好像在一年前还是半年前,看过的《游戏人工智能编程》好像提到过,不过... 似乎被带过了,因为没用到过所以也没注意])
(根据 Navmesh 一般使用传统的 A
计算最优网格路径,然后使用拐角点算法或光线照射法进行生成最终的路径点)

# “SkinMeshrender 里边,是怎么把顶点 XXX (忘了...)”

答:?再说一篇呢?
问:XXXXX
答:... 然后 Skinmeshrender 里面好像还保存了一个矩阵,可以把相应的顶点信息转化至世界坐标,然后显示出来(说实话,这个问题我好像没怎么明白问什么...)

# “热更新怎么实现?”

答:我们项目没用过,不果我也知道一些。比如 PC 上,通过反射实现,事先定义相应的接口,逻辑则在另一个地方(项目)去写,然后编译成 Dll 代码放过来,这样主程序就可以通过反射,来运行 Dll 里边实际逻辑代码。(话没错吧?是可以这样做的吧?)
问:哦,你们没做过啊?那 Unity 怎么使用 lua 呢?要是你会怎么做?
答:我虽然没用过,不过知道一些...lua 是脚本语言,可以实时编译(解析)(相当于下载一个文本文件,然后 Run,就 OK 了),Unity 有相应的插件实现,毕竟自己做的话,还是很麻烦的。
问:哦,插件啊。(不用现成的解决方案 [slua,ulua,nlua 等],难道到自己专门实现?)

# “AABB 碰撞检测是怎么实现的?”

答:AABB,就是矩形包围盒,通过判断坐标 X、Y、Z 是否位于那个坐标 (X [min]<X<X [max]、Y [min]<Y<Y [max]、Z [min]<Z<Z [max]) 范围内,决定是否在包围盒内部。
问:我是想问投影
我:数学上的意义?
问:对,我问 AABB 主要就是想考投影
我:.....(AABB 碰撞检测跟投影有关系吗?投影我知道怎么算... 但是碰撞检测需要投影吗?因为没研究过最最底层的碰撞测算法,所以真不清楚 [也许真有呢?后来百度了一下,找到一点信息,确实有些关系:http://blog.csdn.net/liuhannan111/article/details/52514077,对于场景两个物体的碰撞检测,确实好像是通过投影到几个轴方向平面测试相交判断。不过研究碰撞检测具体算法.... 我承认之前确实没仔细研究过,首先我不是做那一块儿的,其次毕竟 Unity 封装得太好了,就算单独测试两个 Box 的相交,也可以直接使用 Bounds 的 Intersects 判断。)

# 看你简历上说对 C# 研究挺深的那么:“GC,内存回收是怎么实现的的?”

答:C# 里边创建 String、类都会造成 GC (堆上的内存 [如引用类型] 会被 GC 自动回收,对于最多的 String 处理,可以用 StringBuilder 减轻 GC 消耗)。
问:内部是怎么实现的呢?
答:不是很清楚...(如果是刚学那会儿估计没问题,过了一两年么没看,都忘了... 果然裸面是很不好的...[C# GC 被分成 3 代,每代容量超出上限则开始工作,自动对失去引用,即不再使用的对象进行回收])

# “C# 里边的堆和栈有什么区别?”

(好像是这样问题)
答:C# 里边的话,像是类一般都是放在堆里边,而结构体、Float、int 等类型,则是放在栈里面(堆失去引用会造成 GC,而栈不会)——(好像回答也不是很好,不管了)(准确来说,应该是:在一般情况下,引用类型数据放在托管堆里,其地址放在栈中,由 C# 回收机制自动回收,会造成 GC;值类型放在栈内存,由系统自动回收。另外栈速度比堆的速度更快。堆的容量比栈更大)

# “DrawCall 你知道吧?是指的什么?”

答:GPU 每次绘制一次,就会造成一个 DrawCall。(应该说是从 CPU 向 GPU 发起的一次绘图调用命令)
问:DrawCall 是 GPU 的,还是 CPU 的?
答:GPU(Ops! 因为主要操作时 CPU 准备数据,设置各种渲染,最后将这个命令发送至命令缓冲区。所以... 似乎、大概、好像应该是是 CPU 上的处理,与 GPU 占点关系的就最后的 Draw 了⊙﹏⊙!)
问:一次绘制具体是怎么处理的?
答:CPU 读取内容至内存,然后传送到 GPU 的显存,GPU 再读取显存内容进行绘制(当时好像回答不对... 查了下应该是:Draw Call 实际上就是调用一次 GPU 的绘图接口,不过在调用之前,CPU 会向 GPU 发送信息,设置各种状态,最后调用图形 API 的绘制的接口。对于每个单独物体,都会这样干,然后就造成一次 DrawCall。因为 CPU、GPU 并行,所以性能瓶颈主要在于 CPU 对于一次 DrawCall 的提交)。

# “看你说会 Shader?”

答:嗯.. 会一点。
问:“那你自己为什么要写 Shader?”
答:(... 写 Shader 还要有具体理由吗?)当然是 Unity 自己的满足不了需求,比如说之前的做的那个 Demo,需要实时修改地形,如果玩家挖矿挖着挖着,挖太深的话,使用原本的地形 Shader 就会造成贴图拉伸,所以就找到了 Tri-planar 技术来修改了地形 Shader。
问:(明显不满意)

# “Shader 主要操作的是什么?”

答:看自己了,Shader 里面分为了 “顶点” 和 “片段” 处理程序,“顶点” 里面的处理就是操作顶点,“片段” 里面的处理就是操作像素。

然后,然后就走了。

【以上,想起来的大概就是这些问题,括号内为面试结束后才想到 (总结) 的内容】
【看了一下,问题还不少... 另外多数倾向于图形学底层知识。虽然多数了解一些,笔试大概还好一点,面试... 没有思考时间,中间好些问题回答得都很糊涂】
【亏我还把电脑搬了过去,结果没用。人家也没看过 Demo,甚至管都没管,果然是不对口么】
感觉真失败,虽然就算成功了应该也是不会去的,但是失败了还是挺失望的。最主要还是自己太自大了,果然裸面也是很不好的。

更新于