前言
本文主要用来介绍自己大学期间总结出来的面试经验及面试技巧, 面向游戏客户端和游戏引擎开发岗位,原因在于,我很少看到与游戏岗位相关的面试经验总结,因此希望本次自己的经验能为那些想要进入游戏行业的新人提供或多或少的帮助
有关我的大学生活和大学四年经历总结,请看:
雪流星:从超级大白到游戏引擎开发工程师,我经历了什么zhuanlan.zhihu.com废话不说,直奔主题。
基础知识
其实个人觉得,对于应届毕业生,在求职的过程中,企业重点考察的还是基础知识,即便是算法岗位,只要把握好基础,再加上常刷算法题,拿到offer也并不是难事。因此,本文将重点介绍进入游戏行业所需的基础知识。
编程基础
身为计算机专业出身的话,一般情况下都会有语言基础,包括C.C++,C#,Java等,在笔试和面试的过程中,求职者可以自由选择自己最擅长的语言编程,而且面试官在面试前还会问你最擅长的语言是什么,因此只要你能熟悉一门语言,就有了笔试和面试的资本,但是,求职游戏开发岗位的话,最重要的一门语言不是C#和Java,而是C++。我在面试的时候,基本没有面试官问过我Java和C#的,全程C++,因此一定要重点掌握C++语言。
当然了,我说的语法基础并不仅仅包含C++的常规语法,因为面试官在检测语法基础的时候,一般都会选择去问C++11以后的新特性,C++ STL原理与实现,C++内存管理,C++面向对象编程等。在这里我强烈推荐侯捷老师的课程:B站链接安排一波:
当然了,我说的语法基础并不仅仅包含C++的常规语法,因为面试官在检测语法基础的时候,一般都会选择去问C++11以后的新特性,C++ STL原理与实现,C++内存管理,C++面向对象编程等。在这里我强烈推荐侯捷老师的课程:B站链接安排一波:
C++ STL 体系结构与内核分析--从平地到万丈高楼www.bilibili.com C++内存管理--从平地到万丈高楼www.bilibili.com C++面向对象高级编程(侯捷www.bilibili.com 侯捷——C++11新特性www.bilibili.com大厂面试重点,侯捷老师全部帮你搞定。简直是必看视频。(链接失效的话直接在B站搜索“侯捷”就全都有了)
在这里插入图片描述
至于书籍,有很多相关的,因为我觉得没几个人会看,而且侯捷老师的视频真的足够了,就不做过多介绍了。
C++内存管理常考察点:
- C++的构造函数,复制构造函数,和析构函数。什么是深复制和浅复制,构造函数和析构函数哪个能写成虚函数,为什么。
- C++数组,链表,二叉树的内存排列是什么样的,结构体占多大内存如何计算,类占用多大空间如何计算,空类的空间是多少,为什么。
- 虚函数和虚表的原理是什么(重点)
- 内存泄漏出现的时机和原因,如何避免
- 指针的工作原理,函数的传值和传址
- new和delete使用解释一下,和malloc和free的区别
- C++内存区域划如何分说一下(栈,堆那些)
C++11 新特性:
- 说说常见新特性你知道那些
- 智能指针用过吗,有哪些,他们的区别和各自的优缺点
- auto关键字知道吗,如果全部都用auto声明变量行不行
- lambda表达式会用吗
- override关键字必须吗
- 右值引用说一下,可能会实际应用(重点!!!)
C++STL:
- STL的六大部件和联系
- STL容器知道哪些,都解释一下,原理是什么,实现一下链表(接下来就可能考察算法题了)
- map,multmap,set,multset的原理(接下来会考察二叉树相关的题,我后面会介绍)
- hashtable的作用与原理
- 操作符重载问题
- 前置++与后置++的区别,操作符重载的角度分析源码实现
- 函数模板(泛化和特化的问题),什么是全特化和偏特化
- STL中常见的算法用过哪些,原理是什么(随机数,查找等)
以上问题出现的频率最高,大厂基本必问,所以你需要必会。 答案均在侯捷老师的视频中。
面试题总结
- 右值引用的应用,优点,lambda表达式(网易客户端,吉比特)
- 空类的占用的内存,结构体的占用的字节数,虚函数和虚表(基本大厂都问)
- 虚析构函数的作用(完美世界,网易,米哈游)
- 传值和传址,深复制和浅复制(吉比特)
- 前置++和后置++的本质区别,原理是什么(网易互娱)
- map,set的原理,别的容器会那些(完美世界,腾讯QQ音乐)
- C++内存空间划分,值类型和引用类型,C#的垃圾回收原理(完美世界)
- new和delete本质是什么,和malloc和free的区别(完美世界)
- 内存泄漏如何造成的,如何避免(可以使用智能指针)(完美世界)
- 智能指针有哪些(吉比特,网易)
- 动态链接库和静态链接库的区别,exe是静态链接还是动态链接(exe是静态,dll是动态)(网易)
- 二维指针(往往是选择题或填空)
- 指针和引用的区别
- 宏定义,常见的宏指令,define,ifdef那些
- null,nullptr的区别
学习方法:刷牛客网选择题库数据结构与算法
说到数据结构和算法,这个永远也学不完,数据结构与算法的延申永无止境,论其重要性的话,可以在找工作的时候发挥一般的作用,甚至决定你能不能进入想去的公司,像腾讯和网易的笔试(游戏客户端),直接摆上五道算法题,基本上完成3道题以上才有资格参加面试,但是只要刷过leetcode,基本上都能做出三道题,剩下的两道题确实不简单,不过只要有机会参加面试,就达到目标了。
关于数据结构和算法,下图几乎包含所有必会的知识了,只需要按照这个图的内容整理学习即可。
(图片选自知乎@程序员吴师兄呀)
在这里插入图片描述
学完这些知识我觉得至少需要1个月,而且最好手动实现一下,最起码要懂其中原理。
最常见问题汇总:
- 数组和链表的区别,增删改查时间空间复杂度
- 二叉树的前中后遍历,以及各种变形,基本都可以在leetcode上见到
- 二叉搜索树,平衡二叉搜索树(AVL和红黑树)至少要知道原理,不过基本没遇到会让实现的
- 哈希表相关的时间空间复杂度,以及哈希表应用,(常见算法题)
- B树,B+树,2-3树,2-3-4树的关系和维持自平衡的原理
- 各种排序的时间复杂度,尤其是归并,快排,(重点)
- 动态规划的回溯法(往往是笔试题最后两道大题)
各大排序算法时间空间复杂度总结,关于稳定性,很多人都没有理解其意思:它是指对于相等的值,在排序前和排序后的位置问题,如果排序后相等的值位置发生改变,就是不稳定的,反之就是稳定的。它对算法的时间复杂度没有影响,只是当要求在两个值相等的时候去排序,它排序后的位置和之前的一样,就需要用稳定的排序算法。这个经常出笔试题中的选择或者判断。
在这里插入图片描述
重点推荐相关学习算法的公众号:
- 五分钟学算法
- labuladong
重点推荐:
慕课网讲师liuyubobobo的C++教程,非常棒,因为是付费的,所以就不公开了,想要的可以私聊我
使用leetcode刷算法题的时候,一定要注意总结,因为题非常多,前期从二叉树开始,一定要熟练掌握三种遍历,这个是非常多算法题的解题思路。字节跳动面试官对二叉树简直“情有独钟”。熟悉二叉树的题后,容易形解题思维,接着就是数组和链表相关的题,滑动窗口很重要,可以解决很多问题,之后就是图相关的了,包括单源最短路径,图的遍历,最小生成树等问题,再之后就是回溯和动态规划问题。
关于动态规划,建议观看九章算法侯卫东老师的视频,非常详细。
之前能在B站上找到的,现在找不到了貌似.
干货汇总:我经历过的常见面试题总结(数据结构与算法):
- 实现快排(腾讯)
- 动态规划例题(腾讯)
- 排序时间空间复杂度(几乎每个公司都问)
- B树,B+树,2-3树原理(完美世界)
- 二叉树前中后遍历(字节跳动)
- 数组与链表的区别和联系(米哈游)
- 与或非运算,一个数的二进制下有几个0或者1(完美世界)
- 大整数运算(算法题)
- 动态规划问题(博弈型(谁嬴谁输),背包型(最优解)回文串问题)
- 滚动数组,滑动窗口也很常见
学习最优方案:刷leetcode,看视频教程,弄懂原理操作系统
关于操作系统,需要掌握的知识比较少,但是确是面试重点考察知识,基本上知道我列举的这些知识点就基本没问题了:
- 操作系统的四大功能:进程控制,内存管理,设备管理,文件管理
- 进程的定义:并发程序的执行,进程的同步与互斥
- 进程的状态:创建,终止,挂起,激活,阻塞,唤醒,以及相互转换关系
- 进程同步问题:生产者消费者模型,信号量机制
- 进程的调度与死锁,死锁条件
- 进程死锁的原因,如何避免
- 存储器管理:只读存储器,随机存储器,相对地址和绝对地址
- 速度问题:CPU>寄存器>缓存>主存>磁盘缓存>硬盘
- 程序的装入和链接(动态装入,静态装入,重定位)
- 内存空间划分算法:首次适应;最佳适应;最坏适应
- 段式存储和页式存储,以及段页式存储的优缺点,原理
- 页面置换算法(LRU,LFU,FIFO这些)
- 进程与线程的区别和联系
- 多线程编程安全性
- 线程池,线程的创建,同步,安全问题
- 信号量机制
计算机网络
计算机网络主要需要掌握以下知识:
- 网络模型划分(五层和七层),每一层的功能
- 三次握手和四次挥手具体过程,为什么要这样
- TCP/IP协议组成
- UDP协议与TCP/IP协议的区别
- Http协议相关知识
- 网络地址,子网掩码等相关计算
相关问题答案:
![5ef988f14224a1e97e84f8f10ab3071b.png](https://i-blog.csdnimg.cn/blog_migrate/8d27daa2e6d7dffe0d9f283174b31744.jpeg)
学习方法:查找相关知识,刷牛客网上的题
数据库
数据库对于游戏客户端开发和游戏引擎开发基本用不着,最多会出几个选择题,参加面试的企业只有网龙面试官问过我数据库,我基本都不会,但客户端相关的都答上来了,也通过了面试,因为不会涉及数据操作,所以我也不做过多介绍,只要把牛客网上常见的 数据库题做做就行。设计模式
这个没什么好说的,常见的设计模式原理要懂,尤其是单例模式的实现必须会。这个经常和项目挂钩,问项目用了哪些设计模式,或者单独问你某个设计模式的原理和应用场景。
必知的设计模式:
- 外观模式
- 状态模式
- 单例模式
- 迭代器模式
- 观察者模式
最好就是全都会游戏引擎基础计算机图形学
计算机图形学的基础是线性代数,这个数学基础必有,不然很难理解常见的概念的原理。
关于如何以最快的速度学会计算机图形学基础,我推荐看一下闫令琪老师的课,是我目前接触到的最佳计算机图形学教程如果一开始看这门课,自己也不至于费很多时间学它,链接:
坐标变换
坐标变换在渲染管线当中的应用非常广泛且重要,是处理顶点数据的重要操作。为了实现坐标变换,就必须使用向量和矩阵的相关运算。对于一个顶点经常做的变换是平移,旋转,缩放,每一种操作都有对应的运算矩阵,只要我们获得该顶点的三个分量,就可以对它进行矩阵相乘运算,来获得对应的变换。
目前的一些图形API如OpenGL,最终会将可见的顶点数据都转变为标准化设备坐标,即每个顶点的x,y,z.坐标都应该在.归一.化的范围内,.即-1.0.到1.0.之间,在这个坐标范围的顶点将被视.为屏幕可见。而为了将物体模型的坐标位置信息映射到标准化空间下,就要对这些顶点坐标做矩阵变换。
坐标在进行变换的过程中和渲染管线有些类似,都是通过分步逐一进行的。物体的顶点坐标从局部空间变换到世界空间,再从世界空间变换到相机空间,每一步坐标变换都需要乘上对应的变换矩阵,在变换的过程中,通常会接触到5个坐标系统:
(1) 局部空间(或者称为物体空间)
局部空间是指在物体空间坐标系下,每一个顶点相对于物体中心的坐标位置。比如对于一个立方体,它的中心为原点坐标,那么他的八个顶点将也会根据其边长进行确定。这些位置坐标便是该立方体的局部坐标。
(2) 世界空间
在游戏场景中,会存在很多独立模型,为了对这些模型的位置信息做统一表示,需要将这些物体都转移至世界坐标系下,世界空间就是对场景中所有物体统一的一个坐标空间。这样就能对场景中的所有物体进行统一的管理。
(3) 观察空间(或者称为视觉空间)
在游戏场景中的物体最终需要显示到屏幕上的,而为了检测某个物体是否可以显示在屏幕上,就需要引入摄像机的概念,摄像机在游戏世界里有些类似于人的眼睛,只要它可以看到,就意味着能最终显示在屏幕上。观察空间便是以摄.像机为原点的坐.标空间。
(4) 裁剪空间
为了判断一个顶点坐标是否在相机可见的范围内,需要将顶点数据映射到一个范围内,如果顶点坐标的数值属于该范围,就说明在屏幕上可见,而不属于该范围内的顶点坐标则视为在屏幕上不可见,对于不可见的顶点,我们需要把它们从缓冲区中裁剪掉。为了实现将顶点数据映射到一定范围内的这一过程,我们就需要借助矩阵当中的投影矩阵。在使用投影矩阵时,我们需要指定一个相机的可视范围,比如在z轴上坐标值在-1000到1000的物体将被视为相机可见。接下来投影矩阵会对该范围进行坐标映射,从-1000到1000映射到-1到1。当物体的坐标值不在-1.0到1.0的范围之间时,会被视为不可见,最终被裁剪剔除出去。而顶点数据在通过投影矩阵运算后的坐标,就是裁剪坐标。
(5) 屏幕空间
屏幕坐标比起之前的坐标空间就好理解很多,故名思意,屏幕空间就是将.坐标进行变换的最.终坐标系。需要注意的是,屏幕坐标空间是二维坐标.空间,即只有x轴和y轴。相机的正交投影和透视投影
摄像机在渲染管线中作用非常大,在游戏世界里,摄像机担任的角色类似于人的眼睛,摄像机所看到的内容最终会被绘制到屏幕上。为了模拟人的视野,摄像机具有近远平面和视野等属性,通过这些属性,可以绘制出一个视锥体,所有在视锥体内的物体初步判定为视野可见。
摄像机具有的最重要的属性是投影方式:即正交投影和透视投影。正交投影和透视投影两种投影方式的本质区别是投影矩阵的差异以及视锥体的不同。正交投影一般应用于平面或者2D游戏当中,使用正交投影矩阵进行平面映射。而透视投影一般应用于空间或者3D游戏。使用透视投影可以模拟人的视野,物体之间将具备更加贴近现实的遮挡关系,透视投影进行投影的方式是通过透视投影矩阵。
正交投影矩阵应用于一个立方体视口下,不在这个立方体之内的顶点都会被剔.除掉。因为正交投影矩阵围成一个立方体,因此为了生成正交矩阵,就需要指定对应的长度、宽和高。当顶点坐标在这个立方体内,则视为视口可见,不会被剔除。正射投影相机原理如下图所示:
在这里插入图片描述
透视投影矩阵定义了一个锥体空间,其中最.重要的参数是FOV(Field of View),就是相机的视野角度。通过该角度和进平面远平面围成一个封闭的锥体,在该锥体范围内的物体将不会被裁剪掉。透视投影广泛应用于3D空间,因为它能模拟人的视角去观察物体。因此在透视矩阵下,物体能表现出深度信息与遮挡关系。
在这里插入图片描述相关运算矩阵,在闫令琪老师的课里会有详细说明mipmap
在计算机渲染一个物体的时候,对于透视投影情况下,当该物体距离摄像机非常远时,映射到屏幕上的像素点非常少,这就导致采样命中率降低,这样纹理寻址速度会变慢,性能会降低。同时对于高分辨率的物体来说,也会造成不必要的内存浪费。
为了解决上述采样率过低的问题,出现了多级渐远纹理(mipmap)多级渐远纹理是以空间换时间的方案,通过保存原尺寸贴图的四分之一大小,直到最小尺寸为2*2为止。在纹理寻址的过程中,会选择与映射到屏幕时对应的像素点数最接近的一张纹理,然后使用该纹理做纹理寻址,如图所示:
使用mipmap会造成多用33%的空间,但是使用它的好处也非常明显,换句话说就是使用空间换时间,利大于弊。对于阴影贴图来说,使用mipmap在做纹理寻址时也是一项重要优化。通过mipmap加快阴影映射,在性能上还能有一定程度的提升,但是当场景中物体离摄像机极远时,最好不要使用mipmap,因为这样会导致阴影极度模糊,造成阴影不真实的现象。抗锯齿
关于抗锯齿,我曾出过一篇博客做相关说明,有兴趣的可以看一下:
抗锯齿算法光照与阴影
光照和阴影是一个非常大的话题,大到我总结不完,之前自己写过相关的博客:
延迟渲染
光照
阴影相关的貌似没做总结,现在大概介绍一下:阴影
阴影绘制的实现基础是Shadow Map算法,Shadow Map的绘制过程如下:
将物体顶点数据通过矩阵运算转移到灯.光空间下。从局部空间转移到世界空间,在转移到灯光空间下,对于不同的灯光,有着不同的投影矩阵,这里涉及两种投影方式:正交投影和透视投影。两种投影方式分别对应着不同的投影矩阵及视觉效果:正交投影往往应用于2D.游戏中,透视投影应用于3D游戏.中,但并不绝对。在灯光坐标下渲染物体阴影:
在这里插入图片描述
在灯光空间下.创建一张深度纹理贴图,用于保存物体在灯光空间下的深度信息,此深度贴图则是摄像机的渲染目标。灯管空间下的物体深度信息将被保留在该深度贴图中。
渲染深度贴图的过程比较简单,首先在该视口下的顶点信息进行判断,如果某个顶点的深度值比深度贴图中的值小,就更新贴图数据,反之丢弃掉该数据,直到遍历一遍所有像素点为止。遍历完成后,便得到了深度信息图。
获取到深度贴图后,如果某个点在光源视角下的深度值大于深度贴图中对应位置的深度值,就说明它被某个物体遮挡,因此是在阴影中的;反之,深度值小于深度贴图中的值,则不在阴影之中。
判断完成该顶点是否需要接收阴影后,需要做的最后一步就是对该顶点乘上阴影的颜色,遍历完一遍该物体的所有顶点后,便可得到该物体接收阴影的效果。
在这里插入图片描述
Shadow Map 伪码表示:
算法3.1: Shadow Map。
输入:顶点位置坐标。
输出:在灯光空间下是否可见。
BEGIN
(1) 将顶点坐标转换到灯光空间下,需要乘变换矩阵
(2) 计算该顶点在灯光空间下的深度值
(3) IF 该顶点的深度值大于深度贴图中对应点的深度值
(4) 返回FALSE
(5) ELSE
(6) 返回TRUE
(7) END IF
END
关于深度缓冲,可见博客:
深度缓存渲染管线
首先说明 ,渲染管线大厂必问,熟练各个流程至关重要渲染管线的概念
计算机的渲染管线是实时渲染的重要过程。渲染.管线是以流水线的形式,将一个模型的顶点坐标,法线,切线,颜色等数据信息从CPU传递给GPU,然后通过GPU进行计算,最终将这些顶点数据通过插值的形式显示到屏幕上,最终能从屏幕上看到该模型的样子。渲染管线通常被分为四个阶段:应用阶段,几何阶段,光栅化阶段,像素处理.阶段。接下来将介绍每个阶段的大概任务:
(1) 应用阶段:应用阶段是指在CPU端进行处理的阶段,包括物理碰撞检测、物理模拟、动画计算等任务,对于3D游戏来说,游戏中包含大量的模型,3D模型中保存着模型的顶点坐标,法线,切线,颜色等数据,这些数据一般通过向量进行存储,CPU从模型中获取这些顶点信息数据,并将这些数据传送给GPU作为最开始的输入数据。然后将数据送到渲染管线中。
(2) 几何阶段:几何阶段主要执行顶点.坐标变换、顶点处理、坐标裁剪等操作,计算对象为顶点数据,即模型的顶点数据,在这个阶段,做的最多的操作就是顶点坐标变换,从模型空间变换到世界空间,然后再从世界空间变换至相机空间。这样在相机坐标系下就能方便地进行裁剪,裁剪的作用是判断顶点是否可见。
(3) 光栅化阶段:相比于屏幕上的像素点,顶点数据要少很多,这就有一个问题:无法实现从顶点数据到屏幕像素上的映射。而为了达到这一目的,就出现了顶点插值运算,即将两个顶点之间的空缺部分通过插值的形式进行填充,以达到能实现从顶点数据到像素上的一一映射,最后将渲染的结果显示到屏幕上。
(4) 像素处理阶段:像素处理阶段包括像素颜色计算、像素变换,透明度混合等操作,处理物体渲染顺序及深度测试等。这个阶段要处理的内容比较多,可以在此阶段中利用一些算法实现非常多的屏幕特效,比如高斯模糊,景深等,此阶段是游戏渲染中应用非常广泛的阶段,但因为计算对象是像素点,因此实现相关特效时比较耗费性能。渲染管线流程
渲染管线以流水线的方式进行工作,前一部分的输出值是后一部分的输入值,例如,当顶点信息传入顶点着色器后,顶点着色器对这些定点信息进行坐标变换,输出的值会传入片元着色器,作为输入值做进一步计算,直到完成在屏幕上的显示。虽然渲染管线的整个流程比较复杂,但是大部分操作是通过计算机硬件自动计算完成的,如图元.组装和光栅.化阶段,不需要人们干涉。而需要编程实现的部分就是顶点着色器和片元.着色器。这两个可编程着色器是渲染管线中对数据操作的核心之处,通过这两个着色器的计算,便可实现非常多的渲染效果和计算机图形特效。
渲染管线可以被视为计算机图形学的核心知识,渲染管线决定着计算机进行图形化渲染的整个流程,从数据顶点信息,通过一步步运算,以流水线的方式,最终处理成屏幕像素点,这个过程就需要渲染管线进行操控。
在当今知名的游戏引擎里,程序员均可对渲染管线中可编程阶段进行操控,实现在GPU上的编程计算工作,实现想要的屏幕效果。渲染管线最重要的两个阶段就是顶点着色器和片元着色器这两个阶段了,因为这两个阶段是可编程阶段。目前众多的图形API,如OpenGL和DirectX都会提供想应的接口,供使用者自定义渲染方案。
在渲染管线的渲染流程中,顶点数据的变换过程如下:
在这里插入图片描述 渲染管线几个阶段
(1) 顶点数据:一个模型或者图形是由点线面构成的,为了让计算机绘制出这个图形,就必须告诉计算机这些数据的值,顶点数据包括顶点坐标,坐标的切线,法线,颜色等信息,对于OpenGL,这些数据一般都是向量(Vector)结构体,对于游戏引擎,这些数据来自导入的模型当中,在开始渲染之前,CPU会获取这些数据,然后将其传递给GPU,作为最原始数据,做好计算准备。
(2) 顶点着色器:顶点着色器(Vertex Shader)在渲染管线中的作用非常大,是渲染管线的第一个可编.程着色器,处理单元是顶点数据。顶点着色器的主要功能是对坐.标进行.变换。将输入的局部坐标变换到世界坐标、观察坐标和裁剪坐标。除此之外当然也可以进行光照着色,但是着色效果远不如在片元着色器中进行光照着色,因为计算量较小。
(3) 图元装配:图元装配(Primitive Assembly)是对传入的顶点数据进行重新组装,将顶点着色器的输出作为输入,这一点正验证了渲染的过程是以流水线的形式进行的,图元装配会将顶点装配成指定的图形,与此同时,会进行裁剪、被面剔除等操作,以减少不必要的计算,加速渲染过程。
(4) 几何着色器:几何着色器(Geometry Shader)会将图元装配阶段输出的数据作为输入数据。几何着色器不属于可编程阶段,由硬件设备自动完成,其主要作用是对顶点数据进行重构,可以在此阶段产生新的顶点数据,来弥补之前存在的一些问题。以便为接下来要进行的操作做好充分的准备工作。
(5) 光栅化:光栅化阶段(Rasterization Stage)的输入数据来自几何着色器的输出数据,光.栅化的意思很容易理解,到目前为止,渲染所处理的数据对象为顶点,无法通过一一对应的方式映射到屏幕上,而为了实现顶点到屏幕像素的一一映射,就出现了光栅化。换而言之,光栅.化的作用就是将两个顶点直接缺少的像素点通过插值的形式进行补充,生成片元着.色器可以处理的片段。此阶段.人为不可干涉,由硬件完成插值计算。在插值的过程中,会将不可见的顶点进行剔除。
(6) 片元着色器:片元着色器处理的对象将是像素点的颜色信息,也是最终显示在屏幕上的像素点,在这个过程中,可以处理光照和阴影计算,将处理完的值保存至缓冲区当中。
(7) 混合处理阶段:混合处理阶段属于屏幕后期处理范围,这意味着此阶段主要做的任务为屏幕优化操作,通过片元着色器得到的像素,有些不能被显示出来,比如透明度为0的像素点,对于这类像素点,我们需要进行测试,测试的范围包括Alpha测试、模板测试和深度测试等。不能通过测试的像素点将会被丢弃,就不会参与接下来的操作;通过测试的像素点会进入混合阶段。混合阶段主要是要处理透明物体,物体的透明度通过Alpha值来表示,范围是从0.至.1, alpha=1表示完全不透明,alpha=0表示完全透明。测试混合阶段基本不需要进行编程,但是常见的渲染管线接口会开放出一些参数给开发者.做调整。游戏常见优化策略
关于性能优化,我曾单独写过一篇博文介绍,有兴趣的可以看一下:
游戏开发中的性能优化
CPU端常见优化点:
1 减少tick的使用,大部分逻辑都是事件驱动的,能不在tick/update里刷就不要在里面刷
2 尽量减少使用get all class方法,性能较低
3 不要频繁创建销毁物体,对象池了解一下
数据传输优化(DrawCall)
1 尽量使用共享材质
2 减少渲染的物体数量,可以减少模型顶点数量,或者尽量使用LOD以及遮挡剔除
3 尽量使用图集
4 动态/静态批处理
关于批处理,我曾写过相关博文做简单介绍:批处理
GPU端优化:
1 注意渲染顺序,尤其是透明物体
2 减少光照,尽量使用烘焙光
3 使用mipmap
4 尽量简化shader计算量工具使用经验
如果经常看游戏开发岗位要求,总会看到会使用Unity及UE4是加分项,因为我做的项目比较多,曾参加过n次游戏开发比赛,因此还算比较熟悉Unity和UE4,目前在公司里使用的是UE4引擎。
在学习引擎的时候,快速上手的方式是
1 先学习计算机图形学,先学习计算机图形学,先学习计算机图形学!
2 至少会相关语言C#,C++
3 大概了解过引擎功能后,直接上手项目,做你想做的游戏,素材无所谓,尽量去实现就行。不要只看视频学习引擎的功能,一定要自己动手做。
面试总结:
其实在面试的时候,我很少会被问到与Unity如何使用的功能,就算问的话,最多的问题是:
- 异步加载
- 热更新,资源加载方式(resource.load)
- Unity shader基础
别的问题几乎没问过
如果你现在还不会使用主流引擎的话,其实影响不算大,算法竞赛也是加分项,只要你在算法和计算机图形学上实力足够,进入大厂不是问题。干货总结,常见计算机图形学面试题汇总:
- 渲染管线流程(腾讯,网易互娱,完美世界,米哈游···几乎都问过)
- 透明物体与不透明物体的渲染顺序问题(米哈游,完美世界)
我的相关博客链接:
![85daf6a4cbd94d6f8070bdd5e5a43cf3.png](https://i-blog.csdnimg.cn/blog_migrate/108206769e9494f2dd616e029e87bac1.jpeg)
- 举例常见性能优化点(腾讯微信)
- 各种buffer的作用(深度,模板,GBuffer等)(完美世界,盛趣游戏)
- 延迟渲染,前向渲染的优缺点(完美世界)
- 阴影渲染的原理(shadow map)(完美世界)
- mipmap性能快的原因(完美世界)
- 顶点着色器和片元着色器的作用(基本都问)
- 采样和走样问题(抗锯齿)
- 包围盒问题(常出算法题)
- 三种旋转表示(四元数,欧拉角,矩阵)各自的优缺点
简历
关于简历,我只能分享一下自己的经验,如果想要的话可以私聊我,就不公开了。
1 必有模块:
个人信息(电话邮箱必有,最好有个人博客)
教育背景,学习成绩相关的
专业技能,这一点要写与求职相关的,无关的技能建议不要加,即便能表现出你会的很多,如果与求职无关,则认为你的简历与岗位不符
项目介绍:两个最佳,所涉及的技术,开发时间,周期,自己的职务,负责的模块,尽量写全,最好涉及到一两个核心算法,或者大的框架
所获奖励:有什么些什么吧,这个看个人,尽量突出自己的算法能力
个人评价:可有可无实习经历
实习经历说实话很重要,尤其是有大厂的实习经历,但如果没有也不要太失落;虽然我大三拿到了实习offer,但因为学校的安排,导致我必须要放弃,在秋招的时候也没有实习经验,不过最后的结果还算满意的,实习经验只是用来加分的,不过如果有机会还是要去企业实习的。笔试与面试
- 关于笔试,每个公司的侧重点略有不同,腾讯网易一般只会出五道算法题,答对三个以上基本能通过笔试,其它企业基本都会涉及选择和填空
- 笔试时间一般1-3个小时,自己把握好时间安排
- 面试持续时间一般1小时左右,大厂最少两轮面试
笔试与面试过程及技巧
- 注意答题时间,重点完成后面的算法题,因为算法题的分值非常高,一般要做对至少一半才能通过笔试
- 面试过程记得录音,以便之后做总结
- 当面试官问到自己不会的问题时,要善于转移话题:例如,当你不会这个问题时,你可以说自己没接触过,不过自己会······巴拉巴拉
- 尽量调动 面试官对你的兴趣,这个就要看个人了,与面试官产生共鸣是件不容易的事,当你做到了,面试基本就能通过了。
- 在会的问题上尽量多说,越具体越好,并引导面试官去问自己会的问题或者是自己擅长的点
- 面试时间一般由自己定,因此选择你自认为最佳的时间点,建议不要选择下午刚上班的时候,面试官那个时候刚休息结束,状态不佳。
求职的几个阶段
- 日常实习
日常实习有两个好处:
1 为校招积累实习经验,防止你大三下半年无法实习,没有实习经验是很大的略势,我平时参加比赛和项目太多了,没赶上,我的一位同学曾在腾讯实习过,而且给了转正(他大二)
2 增强自身能力,对于很多学生,寒暑假几乎就是待着,这样还不如去企业实习,而且在企业实习,实力增长真的很快,尤其是大公司
一般只有大公司才有日常实习,比如腾讯阿里。
- 春招(大三下半年)
如果可以的话,我非常希望大家不要错过这次春招,一是为了找实习。二是为了做经验准备,有这个基础,正式秋招会容易很多 - 秋招(大四上半年)
这个过程一定要静下心来,不和其他同学攀比,每天要刷题,复习巩固知识,同时要参加各种面试,拿到offer后慎重签约,能拖多久就拖多久,如果自己只有一个offer,先签约,再找其它机会 - 春招(大四下半年)
如果你没有找到合适的offer,这个时候你的校招之旅还不算结束,继续投递,因为春招的机会还有很多,我的好多同学都是通过春招进的大厂,包括去字节跳动,百度的,如果你对秋招的offer比较满意,也可以在这个时候找找有没有更好的机会,不过有一个原则:不要轻易毁约
学完这些知识,我用了多久
看到这么多需要学的东西,有的同学可能会担心自己时间不够用(即将找工作)
对于这个问题,我只能说因人而异,如果你有相关课程基础,学透这些刷够面试题大概需要三个月左右,我是从大三上半年寒假开始复习C++相关的知识的,学一遍C++和C#大概用了半个月,在复习基础的同时刷算法题,每天刷3-5道题足够了,对我来说,做再多就会烦;学习操作系统,数据库,计算机网络大概用一周左右,因为基础还可以,而且考点比较少;学习计算机图形学用了一个月,但是还是一知半解,因为我没有相关基础,都靠自学,但是计算机图形学的重要性基本和算法 差不多,从我写的内容也能看出来。这么算的话,两个月左右就可以参加笔试积累经验了,也确实如此,因为实战才最重要。如果你过一两个月参加校招,这段时间猛学还是够用的,(不过虽说用不了太长时间,我基本每天都是学10个小时以上)而且就算校招开始,还有至少两个月时间有企业进行校招,即便在秋招没有拿到offer,也不要太着急,相信自己,努力一定会有成果的,最重要的是相信自己。连我一个双非高校学生都能拿到想要的offer,更不用说比我优秀的你们了。
校招是一个考验耐力和实力的过程,要对未来充满希望,对所做的事坚持不懈,对自己充满信心。胜利就是你的了。注意事项
- 参加校招一定要积极乐观,无论你能否通过想去的公司的笔试面试,都要对自己的未来充满希望,就比如我:想进腾讯和网易,但是没通过面试,最后来到了完美世界,却发现,我所在部门真的很优秀,技术大神一大堆,要学的东西也很多(你永远也不知道自己未来会经历什么)
- 投简历要大胆,面试经验越多,被面试官怼的次数越少,而且基本没有面试官会怼你,甚至还会告诉你的不足
- 善于总结经验,不要面试完就什么也不管了,那样下次问相同的问题你还是回答不上来(我每次都会把面试过程进行录音,总结自己的不足和面试官问的问题,这样我才能把曾经问过我的问题告诉你们)
- 选择offer不要只看薪资,还要注意你未来的发展
- 经常记录自己投递过的岗位和企业,什么时间投的,用的什么邮箱和平台,不然投的多了就容易乱
- 为了减少名企的笔试面试,我推荐大家关注一个公众号:白熊求职和内推军,可以按时告知各大企业什么时候开始进行校招,什么时候截止。
- 个人能力有限,希望本文能为你带来一丝帮助,这样我就没白写了
- 我想说的基本都说了,最后,希望每个人都能拿到自己想要的offer
关于我
关于我的个人经历,请看博客: