写这篇文章的起因
最近参加了某大厂的游戏引擎工程师校招。首先这次笔试面试我觉得是对我自学的一种肯定。非常感谢某大厂的两位面试官,感觉人都很NICE,虽然是视频面试,但是能够感受到某大厂这家公司的优秀文化基因。对某大厂这家公司的好感度爆长。
本来是想等面试之后再记录总结一下,但是我发现面试的非常多,彩虹面,到最后怕忘了,因此总结归纳,反省自我。无论最后过还是不过,我都非常感谢某大厂这家公司,或许这是我人生当中的贵人公司,让我更加确定我努力的方向。就算失败了,以后如果有机会,我仍然会向这个公司努力。
关于笔试
笔试是非常遗憾的,编程三道题其实如果时间充足,我应该都可以做出来。由于时间原因,最后我只做出来两道。编程题最后一题涉及到动态规划。基本来说,都是LeetCode中等题的水准。
简答题一共有两道,一共50分。第一道题是考察游戏空间分区的方案,这个很明显了,KD树、四叉树、八叉树。第二道题是考察动画渲染绘制模型黑色边缘的方法,这个我是一点思路都没有,完全空着,25分全丢。这暴露出为我的问题:我的渲染和图形学知识,非常匮乏!!!
相对于其他开发岗位的程序笔试题,清一色的动态规划来说,游戏岗位的程序笔试题比较而言,是较为容易的。
经验:学习图形学是非常有必要的。继续加深算法知识也是非常有必要的。
关于面试的问题记录
第一次面试,面试官和我的交谈大概是如下的流程:
- 1min自我介绍。
- 对游戏的了解程度?
- 喜欢玩什么类型的游戏?
- 《空洞骑士》的游戏设计怎么样?
- 图形学渲染流程是什么?
- C++基础语法?dynamic_cast?virtual?
- 现场手写程序:区间合并。(LeetCode中等水平)
- 操作系统当中堆和栈的区别是什么?
- 数据结构当中堆和栈的区别是什么?
- 一个数组里面取前k个最小的元素,有哪些方案?
- 数组和链表的区别是什么?链表能否进行二叉搜索?
- 哈希表的存储方式?
第二次面试,面试官和我的交谈大概如下:
- 1min自我介绍。
- 关于喜欢的游戏?(宫崎英高的黑魂)
- 黑魂的弹刀的实现原理?(有限状态机、物理引擎、事件系统)
- 了解哪些渲染算法?(简述了光线渲染算法)
- 你最觉得有技术含量的项目?(SPH流体仿真模拟解算器)
- 手写工厂模式?
- 工厂模式和抽象工厂的区别?(这个忘了。。。)
- 进程间沟通的方法?(管道、共享内存)
- 计算机网络?(不会。。。计算机网络是我大学最差的专业课了。。。)
第三次面试,面试官和我的交谈大概如下:
- 1min自我介绍。
- 对中国游戏行业的理解。
- 对本厂做游戏的理解。
- 用stack模拟queue。(这个比较简单的)
- 判断扇形区域当中的点。(第一次遇到,临场反应是应该和点乘有关,考察3D代数的基础)
- 系统设计题。
- 如何判断一个满二叉树?
总结与归纳
我仍然欠缺很多,我需要继续弥补的:
- 继续学习数据结构与算法知识。深入补充一下现有高级数据结构的知识,实现一遍(红黑、线段树等等)。
- 需要深入学习一下图形学相关知识,渲染知识。
- 需要自己用虚幻搭建一个DEMO出来,做一个我梦想的ACT。(正在努力)
- 学习《深入理解计算机系统》相关章节,了解代码与操作系统的关系。
- 继续补充游戏相关知识和编程深度知识。
感谢某大厂给我这次机会,让我认清我自己的现状。现阶段的面试和笔试证明,目前我努力的方向是正确的,我坚持游戏开发的道路已经有五年了,就算研究生被带进去的课题组是深度学习,但是我一直以做一名游戏开发工程师为我的人生理想。我的终极理想是,参与一次3A游戏的制作。为了理想而努力奋斗,是一件非常快乐的事情。
我想起了《游戏设计艺术》的最后一个章节:“戒指”。当你决心去做游戏工程师那一刻起,这枚戒指就已经戴在了你的小拇指上,他是无形的。意味着作为游戏工程师的责任,意味着通过游戏去创造一个更加美好世界的梦想,意味着用游戏去表达人类最崇高的品质与人性。