回馈牛客,长文总结游戏开发秋招之路
下周准备跟意向公司签两方了,感慨颇多,秋招终于要结束了。
简单介绍下自己的情况,本科野鸡不入流大学,抱大腿拿了块icpc区铜,特长是随大流,方向摸过很多但都没有什么成就,研究生生涯囿于BOSS的项目,虽然是CV方向但做的都是不着边际的工作,0会议0专利,只有一篇已经审了6个月还是UnderView的期刊,可以说是菜鸡本菜了。
年初回校后3月份开始找实习,碰了一鼻子灰,想着我这个小辣鸡在算法红海里也折腾不起什么浪花来,本着对游戏的热爱,毅然转技术栈做游戏开发,这六个月酸甜苦辣各种滋味尝遍,希望这个帖子能给之后跟我一样想做游戏开发技术的小伙伴提供一些便利。
先总结下offer情况,我在秋招阶段只投了游戏公司和做游戏业务的互联网公司。
提前批:
字节跳动(游戏客户端):三面技术+一面HR,offer
腾讯(游戏客户端,天美):一面挂
腾讯(游戏客户端,光子):两面技术后没等来HR电话提前批截止凉凉
网易互娱(游戏开发工程师):一面挂
正式批:
友塔游戏(游戏客户端):简历挂
英伟达(C++图形学方向):现场两面应该挂了
腾讯(游戏客户端,光子):一面技术后无消息
米哈游(游戏客户端):现场两面技术+一面HR,offer
完美世界(引擎开发):远程两面技术+一面HR,offer
盛趣(UE4客户端):现场一面技术+一面HR,offer
网易雷火(游戏客户端):现场三面技术,offer
另外还有几家不是时间冲突就是石沉大海...,就不写了。
我是从4月份开始就用零散的时间准备了
4-6月主要在看C++和图形学的书,做项目之余的零散时间都在看,断断续续看了两个月
6-8月做了两个Demo,一个是实现了光栅化算法的软渲器,一个是光线追踪器,这两个也是牛客老哥推荐做的
8月份开始面试,有不少知识也是边面试边学习,因为游戏技术栈太多太杂了,像我这种半路出家的很难全面系统的复习,因为我意向岗位是图形渲染相关的工作,所以基本每晚我都去看一些相关的技术博客和Paper,也万幸自己坚持了下来,从一开始只敢投客户端开发,到逐渐摸到了图形学的门槛。数据库的知识就全是在面试中学的了,所以一开始面的几家挂的特别惨哈哈。
关于学习过程中的书籍,我的选择是
C++:
<C++ Primer> <Effective C++> <深度探索C++模型> <STL源码剖析> <More Effective C++> <C++ Standard Library>
这上面六本书我都是精读过的,当然因为本科的时候通读过所以看起来快一点,如果时间有限建议只读前四本
图形学:
<Unity Shader 入门精要> <OpenGL Super Bible> <Fundamental of Computer Graphics>
这三本我也是精读过的,同样,如果你的时间很紧,那么用LearnOpenGL这个教程+Unity Shader 入门精要应该就够了
算法和数据结构:
刷题就完事儿了,我leetcode只刷了100题,感觉200-300题比较稳吧。
其他的比如网络用教材应该就可以了,编程模式十分推荐<Game Programming Patterns>这本书,面试的时候有很多场景题可以从书上借鉴到思路,数据库的话是我的弱项就不误人子弟啦。
另外还有精力的推荐看下<Physically Based Rendering>跟<CUDA by Example>,面试应该就游刃有余了。
下面我整理下面试的问题,因为时间太过久远可能记不清到底是哪个公司问的了,也有几家公司表示面试题不希望外泄,就按照技术点分类吧
C++相关
- 虚函数的原理?虚表存放的位置?构造函数能不能是虚函数?
- override和overload?
- union了解吗?为什么要内存对齐?内存对齐怎么实现的?
- C++强枚举类型用过吗?
- volatile关键字?
- inline关键字?虚函数可以是inline的吗?inline的缺点?
- C++类型转换说一下?dynamic_cast什么时候返回NULL?
- C++智能指针了解吗?share_ptr怎么实现的?weak_ptr怎么实现的?那你怎么确定weak_ptr的对象是否还存在呢?
- 赋值和初始化的区别?类构造函数初始化和初始化列表区别?
- 值传递和引用传递区别?
- 拷贝构造函数在什么时候用?深拷贝和浅拷贝区别?什么时候需要注意必须用深拷贝?
- C++内存模型讲一下?为什么堆栈生长方向一个是向上,一个是向下?
- new和malloc的区别?怎么让new不报异常呢?讲下placement new?对void*是怎么看待的?
- C++编译过程了解吗?动态链接静态链接区别?
- vector底层?map底层?unordered_map底层?
- 顺序存储和链式存储各自的优缺点?
- 快排了解吗?时间复杂度?最坏情况是什么情况?我要得到一个升序序列,那么对于一个已经排好序的升序序列和已经排好序的降序序列,快排时间复杂度一样吗?快排快在哪里?
- 二叉树遍历方式?非递归的了解吗?AVL了解吗?红黑树了解吗?
- DFS?BFS?两者的实现?区别?
图形学相关
- OpenGL渲染管线讲一下?坐标变换讲一下?
- 光栅化用到哪些算法?
- 旋转有哪几种方式?欧拉角会有什么问题?讲一下四元数?
- 深度测试了解吗?在什么阶段?那你那么多顶点数据和计算怎么解决?
- 讲一下FrameBuffer?为什么非得要用FrameBuffer?阴影贴图了解吗?
- 纹理坐标?双线性插值怎么做的?
- mipmap了解吗?mipmap有什么缺点?你这个LOD怎么做的?
- 讲一下法线贴图?优点是什么?
- 讲一下伽马矫正?那我们电脑平常存里的图片是经过伽马矫正的吗?
- HDR了解吗?Bloom怎么做的?
- 正向渲染和延迟渲染的区别?
- 你了解几种光照模型?
- PBR了解吗?讲下BRDF?讲下Fresnel方程?讲下微平面模型?
- 讲下Kajiya模型?讲下Marschner模型?
- 了解MSAA吗?
- 光线追踪反射光线怎么确定的?
- 光线求交要计算几次?一次吗?那你渲染一个玻璃体的话,玻璃体后面还有物体怎么解决?
- 动态模糊怎么做的?
- 你这个蒙特卡洛采样是干嘛的?
网络:
- TCP和UDP区别?
- KCP听说过吗?
- TCP三次握手四次挥手?为什么是四次挥手?time_wait干嘛的?
- 长链接短链接?
- 听说过心跳包吗?
- 什么是黏包?怎么解决?
- 帧同步?按你说的一个人有延迟其他人也要延迟?怎么解决?状态同步了解吗?
- socket编程了解吗?讲一下I/O模型?讲一下epoll?epoll底层实现?
手撕代码题:
- leetcode青蛙过河
- 下楼梯问题(斐波那契数列)
- 根据二叉树先序遍历和中序遍历确定后序遍历
- 数字0-n放在数组a[n+1]中,随机将其中一个数变为数组中的另外一个数,在不借助外部空间的条件下找到这个数
- 手撕快排
- 手撕堆排序
- 手撕红黑树的插入和删除(某厂是真的硬核)
- 手撕void* memcpy()
- 手撕Bresenham算法
- 手撕三维空间CVV裁剪
- 手撕Blinn-Phong模型
- 手撕对象池
- 设计类,实现vector的增查删改,底层用链表实现
其他:
- 游戏里的排行榜系统怎么设计?
- FPS游戏里子弹模型怎么设计?
- AOE法术是以自我为中心的矩形,如何判断敌人在射程范围之内?如果控制单位和敌人都是在移动的呢?如果法术是自动攻击最近的敌人呢?
- FPS探头优势在技术上怎么解决?
从决定读研做CV,到决定做游戏开发,其实真的不是一件容易的事情,好在游戏是陪伴了我二十余载的东西,在信仰这块不用充值,从在GBC上火纹第一次接触游戏世界,伴随着CT、CC、异域镇魂曲、FF等重塑我三观的游戏的成长,虽然现在国内游戏市场够烂,大多是流量渠道为王的换皮产品,但对于我,有必须去游戏行业的理由,虽然程序能做的事情有限,但对于我,也有必须坚持下的原因。
最后的最后,希望各位都努力加油吧,也真心的希望这篇帖子可以帮到需要的人,就像当时我被牛客几位大佬所鼓舞一样。