--------------------------前言---------------------------------
游戏是商品而不是作品。--------------白仓一马
---------2021.3.25-----------
面试XX厂后一大堆诡异事情发生,手机碎屏,显卡被偷,今天终于正常了些,春招的求职过程有些曲折,个人感觉可能自己拿到游戏开发相关offer的希望不大,
因此想总结一些经验留给后来人,也想攒点RP。
---大厂和小厂的笔试、面试个人向感知区别--------
大厂: 大厂不用说,注重基础,C++、操作系统、计算机网络、数据结构算法等八股文,个人未参加一些大厂的面试,但和其他同学交流发现对基础的要求较重一些,
算法难度看这个厂本身的实力,但总体来说为LEETCODE中等以上难度,由于本人算法实力较弱,因此可能有些感知上的区别,但总的来说大概如此。
面试考察也多以八股文、中等算法为主,引擎开发相关的话则会考察引擎相关的使用,引擎开发相关笔面经在此不作讨论,但总的来说对游戏引擎的使用经验较为宽松,
不会有太多硬性的要求,即使答不上游戏引擎相关的问题一般也并无大碍,重要是基础扎实。
小厂的话:个人感觉某种意义上比大厂还难,对八股文的考察减弱,加强对算法、数据结构的考察,并会有多道游戏开发实际相关、游戏引擎使用相关的题目的考察,
这些题目个人印象一般大厂都是在引擎开发岗的时候才会考察,因此拿大厂的游戏研发岗位的经验去面小厂容易吃亏(比如本人)。
建议在面试小厂的时候尽量寻找对应的面经看,若没有面经的话亦只能全面复习,不要拿某几个大厂的面经去套,容易被惯性思维坑。
游戏开发实际相关、游戏引擎使用相关的题目本人和朋友遇到的题目有:
Unity tilemap的使用
不知道答案,没用过,朋友遇到的
子弹速度较快时,如何做碰撞检测,伤害同步?
1.射线检测(会有一个问题:手速快的玩家近乎无敌,处理方法貌似是发射时给一个0.2秒左右的延迟)
2.伤害同步个人暂时未有研究,但之前看过相关的教程,略有印象。
造成手机游戏运行卡顿的原因有哪些?
1.网络同步问题
2.抛射物、生成物未能及时销毁(比如弓箭、火球、子弹等)
3.粒子效果的粒子运算在CPU运算而非在GPU运算(CPU粒子、GPU粒子运算相关)
4.待补充 笑
多个具有交互功能的物体或角色,可以进行编程的方式有几种?
1.组件组合(component)
2.继承
3.实现接口
4.待大佬补充。
子弹时间效果的实现
引擎提供的游戏物体运行速率相关的函数接口(Time Dilation等)(UE4实现如此,unity好像也有类似函数)
思想:1.除了自己以外的游戏物体运行速率减慢(我当时UE4的做法是,获取除自己以外的角色、物体,
降低这些角色和物体的运行速率,但是当场景内的物体多的时候会不会有优化上的问题暂未尝试)。
如果不提供接口怎么做?(面试官反问)
1.待补充
2.?这是引擎开发岗吧。
RogueLike相关(朋友遇到的)
不按照一个像素这样游走,而是按照一个区域一个区域这样游走,生成区域变的广阔。
泛洪算法(朋友面试官说的,具体实现未了解)
渲染相关
不算问题,是本人尝试延长面试时间的套路。。不问的话就聊不下去了
请问你们厂这个游戏的卡通渲染怎么做的啊?
会不会很耗性能啊?
PBR和NPR结合有什么难点吗??
这样的话优化会很难吧?
如果面试的厂是二次元相关的厂的话,可以问一些卡通渲染相关的套一下话,延长一些时间。
呐呐呐?你们这个勾线怎么做的啊?之类的。
个人感觉比起问做什么项目,待遇之类的感觉好聊下去吧?(笑,根据面试的厂不同可以调整自己要问的问题)
可以看看知乎上关于卡通渲染的一些文章(罪恶装备GDC技术分析、崩坏3技术分析等),有点印象就可以了,不需要强记。
武器的碰撞检测,除了用collidebox外还能怎么实现?
用两个点或三个点设置在武器的最长端 中间 末端,碰撞检测即为这几个点连成的线是否与物体的
collide box相交
还有游戏引擎的一些相关知识
比如 Unity的UGUI啊,合并网格,Monobehaviour生命周期、大地图加载方案、UE4 Behavior Tree、NavMesh(一般和寻路算法相关)这些,不过都是别人面经上有写,自己未被问到过,被问到了再补充吧。
反正先写到这里吧,个人感觉如果要面小厂的话,最好就是有一定的游戏引擎使用经验,虽然招聘要求上没明确写,但其实是会考察的,
可以去ABOUTCG购买相关的教程学习。
感觉未来的游戏开发岗招聘会越来越难,大厂和小厂的差距也在拉开,小厂对应聘者的要求个人感觉反而比大厂要高。
未来可能会补充一些游戏引擎、游戏开发相关的八股文吧,以后要背的八股文又多了一种。
不过真的要写游戏引擎、开发相关的八股文的话,大概能写很多吧,毕竟都是坑,以后再写。
---------------------关于未来游戏开发招聘难度应聘的幻想---------------
反正越来越难吧(笑)
会问开放世界相关的题目,比如大地图读取处理方案,脚部ik,PBR、NPR、渲染管线之类的,问的问题可能会越来越广?
希望不会吧
----------------------3.26---------------------
被一个做买量流水手游的小厂挂了,第一面HR面挂。
总结:不要表达过多对游戏的热爱和尽量压抑自己对买量流水手游的厌恶。
夜观天象,恐时日无多,更新zanRP
---------------------3.27--------------------
延长时间套路
首先面试前对你要面试的公司做一个了解,看看公司做的什么游戏,粗略的看一看,玩一玩也可以,比如你面米哈游你就看原神和崩坏3
举个例子:
米哈游面试,需要你反问
这个时候,根据你之前对米哈游游戏的认知,从以下几点反问
1.游戏设计
2.优化相关
3.渲染相关
游戏设计的话可以从系统设计,比如过场运镜系统、打击感、脚部IK、动画状态机、AI行为树等问
优化相关的话,可以从地图加载、贴图压缩、粒子效果等等去谈、
渲染相关可以挑卡通渲染的某几个点,比如勾线怎么做,衣服上的阴影用的是顶点色控制还是阙值贴图控制等。
虽然有可能会被面试官反问翻车,但个人感觉比问待遇之类的尬聊会好一些吧。
而且有可能会让面试官对你印象加深,延长面试时间,在面试时间过短的情况下可以使用这个套路。
小厂场景题、应用题因果律预测
这里的小厂可泛指你找不到面经的厂,这个时候就务必思考准备的方向,是要用传统的八股文复习策略还是应用题、场景题预测策略。
个人面试惨败后得出的一个方案是,全面复习,不追求复习的精,但要广,你可以答不上来但要说出思路。
而小厂的场景题和应用题,个人认为应该有一定的预测方法。
在面试前,百度或者其他的科学搜索调查这个小厂最近正在开的新项目和以前做过的游戏。
这个时候,场景题和应用题的出题范围大致就在这些新项目类型和以前做过的游戏之中了。
比如XX厂,做动作游戏和新的枪战项目。
这个时候,可以出的题目可能就有以下题目:
子弹时间功能实现
子弹速度快时的碰撞检测与网络同步
武器碰撞检测相关
换弹功能
载具功能的实现相关(比如根据地形,车辆的水平垂直角度需自适应调整)
打击感的实现等
总而言之,是他们需要做的游戏或已经做好的游戏中,某些功能或系统的设计大概率是会被考到的题。
如果问了其它类型的鬼畜设计题,那也只能自求多福。
总而言之,预测出的题目也有一定优势,也可以帮助你在面试前提高信心。
当面试官问你玩什么游戏的时候,说出来的游戏的类型最好也和你复习过的场景应用题的对应游戏类型一样,这样的话,就算被面试官倒打一耙问对应的游戏设计也不会超出你所复习的范围。
游戏类型场景题、应用题八股文
RTS类型
A*寻路算法、NavMesh相关
ACT类型
动画状态机状态转换方案设计、武器碰撞检测优化、脚部IK、子弹时间功能实现
FPS、TPS类型
换弹功能实现
子弹速度快时的碰撞检测与网络同步
对象池模式的应用
射击
镜头怎么操作的?子弹怎么实现的?有没有类似于手雷的抛物线?
RPG类型
多物体、角色实现交互功能的编程方案: 接口、组件、继承
敌人的行为树设计->衍生出行为树节点功能的考察 sequencer、selector、blackboard等
MOBA类型
帧同步与状态同步?
用UDP还是TCP?
RAC类型
假如要实现竞速类游戏加速时屏幕的效果你会怎么实现
OTHER
五子棋怎么判断胜利的?怎么检索的?一共几个方向?
共通题
游戏排行榜设计
场景内多物体,判断是否碰撞-八叉树
如何判断敌人朝向你?
背包系统,你是怎么样实现的
怎么实现一个黑洞?
黑洞设置一个引力范围,进入这个范围HITBOX对物体施加一个指向黑洞圆心的力(实时计算力的方向),UE4引擎有现有的函数可使用
游戏引擎八股文
NETEASE:
BYTEDANCE:
(未抄袭)
MIHOYO:
https://www.nowcoder.com/discuss/561306?source_id=profile_create&channel=1009
GBIT:
https://www.nowcoder.com/discuss/506817?source_id=profile_create_nctrack&channel=-1
4399:
https://www.nowcoder.com/discuss/506860?source_id=profile_create_nctrack&channel=-1
感谢各位神仙大佬的面经,方便后人抄袭
Unity:
1.什么是AssetBundle?谈一谈你对AssetBundle内存分配情况的理解。
2.谈一谈你对3D渲染管线的理解。
3.简述StringBuilder和String的区别?
4.什么协同程序?
5.Unity生命周期函数
6.谈一谈你所知道的Unity内存优化方法,不少于5条。
7.Unity中动态加载资源的方式 8.谈一谈你对Animation与Animator的理解 9.C#的委托是什么?事件是不是一种委托?
10.unity有哪些组件? 11.C#有哪些特性? 12.资源打包,AB包 13.unity项目中的有哪些优化?
14.unity自带哪些shader?
15.如何处理UI和粒子特效的层级关系?
16.C#的GC机制
17.Drawcall以及性能优化问题
什么是协程 协程与线程的区别
UGUI的渲染顺序是什么? 层级上,A在B的下面,同一个canvas,order和layer相同,可不可能A显示在B上面? 做过动画吗?骨骼动画为什么制作一个可以应用在所有对象上? 线程协程什么关系?还是说两者一致? 开启一个协程后他的第一次执行在update之前还是之后? WWW用过吗? Unity只有一个主线程吗?
粒子系统遵不遵循unity的生命周期? 如果把timescale设为0那粒子系统还播不播?动画系统呢? 一个3d粒子系统有一个父物体,放到了2d中,改他父物体的缩放,粒子会不会收到缩放的影响?
UE4:
讲一讲UE4中怎么使用蒙太奇(Montage)
蒙太奇和动画序列有什么区别
动画蓝图用过什么节点
上身做攻击动画,下身做移动动画怎么实现
动画通知自己写过么
UE4反射机制和垃圾回收机制
什么叫Mipmap
Mipmap分为哪几种
你刚才说了行为树,介绍一下行为树都有哪些节点(UE4)
共通题
渲染管线
深度测试
什么叫骨骼蒙皮 法线贴图
判断两个物体的相对位置(可由多个问题派生出此问题,或由此问题派生出应用问题)
两个向量点乘
有什么用?
用于判断敌人角色和自身操控角色的角度,从而调整自身角色角度使角色一直面朝敌人(锁视角功能实现,AI朝向自身操控角色等)
常见的一些类
Pawn和character的区别是什么
Ue4蓝图和c++如何相互调用(宏)
网格体动画的原理(骨骼,蒙皮,权重什么的)
动画蒙太奇介绍一下
运行时生成物体的函数是什么
Pawn和actor的区别;
我创建了一个uobject对象,在没有其他引用的情况下请问我该如何保证它不会被gc?(根据提示原来使用UPROERTY宏进行标记就可以防止被回收,然后又问还有什么方法,我真不知道啊,他就问我umg怎么进行使用,说到add to viewpoint他说就是用这个可以把这个引用放到根结点,就不会被回收了)
我自己做了个类,不是继承自uobject的,请问怎么使用ue4自带的垃圾回收机制(这个我真不知道)
Actorcomponent和scenecomponent的区别
用什么方式可以维护actor之内的层级关系:(SetupAttachment进行组件间的子类父类的关系维护,其底层是调用了SetAttachParent(InParent);actor之间是attachActorToActor)
说一下动画蒙太奇(balabalabala)
说一下动画的混合吧(blend pose之类的,两套动作,哪个作为basepose比较好,balabala)
请说一下uobject和Aactor创建和销毁方式(生成actor:spawnActor,生成object:NewObject();销毁actor:destoryActor,销毁object:conditionalBeginDestroy)
UE4底层你了解过多少?(我说了ue4自己实现了内存回收和反射功能)
那内存回收过程讲一下吧?那中型的游戏,内存回收需要多少耗时,你猜一下。(我猜一帧以上吧,他说那不得卡死?)
过场镜头调整:希区柯克变焦
图形学八股文
怎么实现描边?
深度检测
沿法线方向向外挤出轮廓
unity中渲染一个半透明物体的过程
渲染半透明物体要关闭深度写入,防止前面的半透明物体把后面的不透明物体覆盖掉,然后开启混合,设置混合模式,然后逐像素的混合半透明物体的颜色和缓冲区中的颜色,这里跟半透明物体的透明度也有关系。
你说你看过《unity shader 入门精要》这本书,里面有一个部分透明的魔方渲染示例,为什么要分渲染两次渲染?还记得吗?
因为透明部分是要关闭ZWrite的,但是关了ZWrite就无法显示出魔方内部的深度关系,分两次是分别渲染不透明部分和透明部分,不透明部分的渲染要开启ZWrite,透明部分则关闭ZWtite,开启混合。
渲染管线过程 哪些部分可以编写
顶点坐标包括哪些数据(位置,像素颜色,索引)
图形学 图片混合如何实现
Shadowmap是什么?
了解过剔除吗,他是在哪一步执行,知道剔除有什么算法实现吗?
shadow mapping 如何实现
常见算法
N个数取m个数
海量数据TOPK
快速幂
A*算法
Dijkstra算法
.求1+2+...+n
写一个memcpy实现
如何获得链表中倒数第k个数 给你一个圆的圆心(0,0)半径为R,实现给出一个在圆内的一个随机点 快速排序的时间复杂度,最坏情况是多少 指定时间后N天 连续数字数组中含0的数量 堆排序 1括号匹配(热手) 2 1 ~ n的数组找缺少的元素 (异或运算, 或者求和相减) 3 简单dp,二维矩阵左上到右下的最短路径。 4旋转数组找target 在一个园内随机生成点(极坐标) A* 寻路算法 AABB盒 二维空间的碰撞检测 八叉树空间划分 给定一个集合S(没有重复元素), 输出它所有的子集,比如{1,2,3}的子集,复杂度是多少? 敏感词过滤 (trie树) 洗牌算法 24点 场景题 一个文件有很多行,每一行都是字符串,其中有一些重复的行,怎么剔除这些行 给定一个无序数组,要求打乱它们的顺序,使得每个元素在每个位置的概率相等-->洗牌算法 分配和释放唯一id,数据量很大,内存有限,如何做?bitmap 读一个很大的文件,超过内存容量,如何处理 高并发、多线程你有哪些理解 数据结构 哈希冲突的解决方法,具体说一下怎么实现 红黑树和平衡二叉树有什么区别 如何构造无向连通图的最小生成树 无向连通图的广度优先搜索是怎么做的 红黑树和AVL树的区别,为什么不用AVL树 智力 1000毒品,1个有毒,999没有毒品 过河问题 53个星期三,下一个元旦可能是星期几
操作系统、计算机体系结构
cache的作用; Cache是介于CPU与主内存之间、或者主内存与磁盘之间的高速缓冲器,其作用是解决系统中数据读写速度不匹配的问题。其中介于CPU与主内存之间的缓冲器又称为RAM Cache,而介于主内存与磁盘驱动器之间的缓冲器则称之为Disk Cache,这里要讨论的是前者,也就通常简称的Cache。 怎么在代码级利用局部性; 现代操作系统中,基本上都带有设计的高速缓存,高速缓存比读写磁盘和主存快的多,在高速缓存中操作数据性能相对于磁盘和主存快很多。系统会把程序最近用到的数据存储在高速缓存中以便程序下一次使用时直接从高速缓存中读取,这就是代码的时间局部性。系统也会把最近用到的数据的临近地址存储在高速缓存中以便下一次使用,这是空间局部性。 高速缓存是最快的存储器吗; 寄存器最快 内存分配机制,碎片是什么; 虚拟内存是什么,虚拟内存是为了解决内存不够用的问题吗; 虚拟内存的基本思想是,每个程序都有自己的地址空间,这个地址空间被划分为多个称为页面(page)的块。每一页都是连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,硬件会立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。 字节对齐; 线程的堆栈是独立的吗,一个栈就够了吗 每个线程一个栈,每个进程一个堆。 线程/进程同步怎么处理 线程:互斥量、读写锁 进程:临界区、互斥量、信号量、事件 死锁的条件 互斥、保持和等待、不可抢占、循环等待 进程和线程的区别 进程是资源分配的最小单位,线程是CPU调度的最小单位 进程间共享内存通信,可以吗?(可以,不能直接共享,要映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问) 进程和线程的关系 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 cpu核心数和线程还是进程关系更紧密? 线程 内存堆和栈有什么区别? 堆和栈哪个存储效率高,为什么? 空间哪个大,为什么? 堆大。 C的栈在x86-64上是直接绑定到CPU指令的,实现上极其精简,因此它与堆不同,没有动态增长、动态缩小的功能,一旦分配出来就会永远占用相应的空间。每个线程都会占用独立的栈空间,这样对于线程数很多的进程来说,如果栈空间分配得过多,就会很浪费内存空间。相反,堆空间可以一开始分配得很小,然后不停向上增长,释放相应的空间之后还可以归还给操作系统,因此适合处理比较大的空间。对于一定要占用比较大的栈空间的情况,可以指定栈空间大小。 为什么服务器程序要用主线程做io,这样不是限制了主线程完成其他就绪事件的速度吗 无锁编程
数学
计算机怎么计算三角函数值;
怎么求一个正交矩阵的逆矩阵;
点乘和叉乘的应用场景
有一个点 如何判断在多边形内 判断凸多边形凹多边形
计算机网络
TCP UDP
可靠UDP
王者荣耀用UDP还是TCP
三次握手四次挥手
timewait是哪个时候
tcp/ip的五层有哪五层
这五层里有哪些协议
如何判定tcp报文是否发送完整
《荒野行动》(多人在线游戏,即时性要求高),要选用什么协议?为什么?
osi哪七层?
udp和tcp在哪一层,ip?http?http为什么?
tcp、udp特点、区别? 哪些场景用udp、哪些tcp? moba游戏用哪种?但udp会丢包啊? 顺序到达不一致怎么处理?从协议层入手还是应用层? tcp为什么要三次握手?两次不行? 为什么要四次挥手?为什么多一次?
人工智能
A*算法 ;
什么是启发式算法,能找出最优解吗,
启发式函数满足什么条件就能保证最优解;
行为树;
强化学习的特点;
MDP是什么;
TD和MC对比;
应用过吗;
了解的强化学习框架
请简述状态机与行为树之间的异同
C++
重载和重写的区别
说一说多态是什么;
运行时多态的原理是什么;
虚函数表是如何组织的,运行时怎么查虚函数表;
C没有继承,能实现多态吗;(提示用结构体)
C怎么实现多态
讲一讲函数调用的过程;为什么参数要从右到左压栈;为什么要有不同的函数调用约定
C++11的新特性:lambda表达式,引用捕获;
右值引用,右值引用的应用场景
C++的GC机制
模版的声明和实现应该在.h还是.cpp
因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。
另外一个方法就是使用关键字“export”!你可以在.h文件中,声明模板类和模板函数;在.cpp文件中,使用关键字export来定义具体的模板类对象和模板函数;然后在其他用户代码文件中,包含声明头文件后,就可以使用该这些对象和函数了。
c++ const关键字用法,初始化
四大转化
栈和堆的用法
c语言申请内存
从静态存储区域分配.
在栈上创建
从堆上分配,亦称动态内存分配
placement new
一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置是根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在已分配的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。 定位放置new操作的语法形式不同于普通的new操作。例如,一般都用如下语句A* p=new A;申请空间,而定位放置new操作则使用如下语句A* p=new (ptr)A;申请空间,其中ptr就是程序员指定的内存首地址。考察如下程序。
智能指针
unique_ptr什么时候会析构
c++三种继承
交叉继承(虚继承)
move()
将一个左值强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义。
默认生成的构造函数
默认构造函数 拷贝搞糟函数
右值引用为什么会提高效率
减少不必要的拷贝
函数调用的过程
Volatile关键字的作用
对象的值可能在程序的控制或检测之外被改变时,应该将该对象声明为 violatile,告知编译器不应对这样的对象进行优化。
使用该关键字后,编译器不会对相应的对象进行优化,即不会将变量从内存缓存到寄存器中,防止多个线程有可能使用内存中的变量,有可能使用寄存器中的变量,从而导致程序错误。
shared_ptr相互引用怎么办?
weak_ptr
Vector和list的区别?
vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此,它能够高效地进行随机存取,时间复杂度是O(1)。 但是,因为其内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,因此时间复杂度为O(n)。 另外,当数组内存空间不够时,会重新申请一块内动空间并进行内存拷贝。 list是由双向链表实现的,因此内存空间是不连续的。 其只能通过指针访问数据,所以list的随机存取效率很低,时间复杂度为O(n)。 不过由于链表自身的特点,能够进行高效的插入和删除。 vector和list对于迭代器的支持不同。 相同点在于,vector< int >::iterator和list< int >::iterator都重载了 “++ ”操作。 而不同点在于,在vector中,iterator支持 ”+“、”+=“,”<"等操作。而list中则不支持。
虚表是哪时候生成的
(编译时)
多态是怎么实现的(讲了一下虚表指针,虚表,运行时确定地址,好像面试官不太满意)
多态:多态就是不同继承类的对象,对同一消息做出不同的响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现方式。在基类的函数前加上 virtual 关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。 实现方法:多态是通过虚函数实现的,虚函数的地址保存在虚函数表中,虚函数表的地址保存在含有虚函数的类的实例对象的内存空间中。
实现过程:
在类中用 virtual 关键字声明的函数叫做虚函数; 存在虚函数的类都有一个虚函数表,当创建一个该类的对象时,该对象有一个指向虚函数表的虚表指针(虚函数表和类对应的,虚表指针是和对象对应); 当基类指针指向派生类对象,基类指针调用虚函数时,基类指针指向派生类的虚表指针,由于该虚表指针指向派生类虚函数表,通过遍历虚表,寻找相应的虚函数。
在gcc编译器的实现中虚函数表vtable存放在可执行文件的只读数据段.rodata中。
传统上vptr放在所有显式声明的成员的最后,不过如今也有一些编译器将vptr放在class object的最前端
Inline标识符的作用
inline 是一个关键字,可以用于定义内联函数。内联函数,像普通函数一样被调用,但是在调用时并不通过函数调用的机制而是直接在调用点处展开,这样可以大大减少由函数调用带来的开销,从而提高程序的运行效率。
说一下智能指针
智能指针是为了解决动态内存分配时带来的内存泄漏以及多次释放同一块内存空间而提出的。
共享指针(shared_ptr):资源可以被多个指针共享,使用计数机制表明资源被几个指针共享。通过 use_count() 查看资源的所有者的个数,可以通过 unique_ptr、weak_ptr 来构造,调用 release() 释放资源的所有权,计数减一,当计数减为 0 时,会自动释放内存空间,从而避免了内存泄漏。 独占指针(unique_ptr):独享所有权的智能指针,资源只能被一个指针占有,该指针不能拷贝构造和赋值。但可以进行移动构造和移动赋值构造(调用 move() 函数),即一个 unique_ptr 对象赋值给另一个 unique_ptr 对象,可以通过该方法进行赋值。 弱指针(weak_ptr):指向 share_ptr 指向的对象,能够解决由shared_ptr带来的循环引用问题。
宏是在哪个阶段进行处理(预编译),const呢(编译)
说一下重载
重载:是指同一可访问区内被声明几个具有不同参数列(参数的类型、个数、顺序)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。
关于虚析构函数的问题
析构函数定义成虚函数是为了防止内存泄漏,因为当基类的指针或者引用指向或绑定到派生类的对象时,如果未将基类的析构函数定义成虚函数,会调用基类的析构函数,那么只能将基类的成员所占的空间释放掉,派生类中特有的就会无法释放内存空间导致内存泄漏。
堆和栈区别
申请方式:栈是系统自动分配,堆是程序员主动申请。 申请后系统响应:分配栈空间,如果剩余空间大于申请空间则分配成功,否则分配失败栈溢出;申请堆空间,堆在内存中呈现的方式类似于链表(记录空闲地址空间的链表),在链表上寻找第一个大于申请空间的节点分配给程序,将该节点从链表中删除,大多数系统中该块空间的首地址存放的是本次分配空间的大小,便于释放,将该块空间上的剩余空间再次连接在空闲链表上。 栈在内存中是连续的一块空间(向低地址扩展)最大容量是系统预定好的,堆在内存中的空间(向高地址扩展)是不连续的。 申请效率:栈是有系统自动分配,申请效率高,但程序员无法控制;堆是由程序员主动申请,效率低,使用起来方便但是容易产生碎片。 存放的内容:栈中存放的是局部变量,函数的参数;堆中存放的内容由程序员控制。
什么情况下会栈溢出
递归
寄存器维护堆还是栈
int类型占多少字节?
32位和64位下都占用4个字节
一个字节的int能表示多少个数?
最大的2^8怎么表示?全为1换算后为多少?
256?确定吗?
有符号的范围是多少?-128怎么来的?
-1怎么表示?
11111111
怎么判断一个浮点数为0?
EPSILON被规定为是最小误差,换句话说就是使得EPSILON+1.0不等于1.0的最小的正数,也就是如果正数d小于EPISILON,那么d和1.0相加,计算机就认为还是等于1.0,这个EPISILON是变和不变的临界值。
判断区间怎么来的?
什么时候会有内存泄漏
Map multi_map unordered_map的区别
map底层:红黑树 只允许一个key对应一个value
unordered_map底层:哈希表
multi_map底层:红黑树 允许一个key对应多个VALUE
Mutable和volatile关键字
C++中定义常量,define宏定义和const关键字有什么区别,内存角度
vector的swap后,占用内存如何变化vector如何尽快释放内存
swap()操作可释放vector所占的内存空间(effective c++)
智能指针有哪些类型,分别应用于那些场景
设计模式
常用设计模式
学习资料、教程网站汇总
ABOUCG
UDEMY
GAMERES
GAMELOOK
腾讯游戏学院
SIKI学院
GDC
数毛社
BILIBILI:未来游戏研究所
UNITY官方平台
UNREAL官方平台
CEDEC 计算机娱乐开发者大会 日本计算机娱乐协会
知乎
安柏霖***Developer@腾讯北极光工作室
https://www.zhihu.com/people/toughbro
游戏开发学习访谈、技术分享、娱乐视频合集
https://www.nowcoder.com/discuss/639443
------------------------------3.28--------------
看其他大佬的面经,看了一些大厂的场景题和应用题,和我朋友遇到的面试体验完全不一样吧,感觉还是看自身的实力和你简历上写了什么东西。
我的某一个朋友面网易互娱的时候,项目只写了一个坦克大战,就没有多问项目和场景题,看其他大佬的网易互娱面经问的问题恐怖至极,
总之自己写简历的时候小心一点8。
昼观天象,恐时日无多,发帖攒RP
今天做所谓的小厂笔试,又被制裁了,算法题难度突然升级。
游戏开发岗位的题目越来越难了,算法题难度直接起飞,面试难度又起飞,未来入行感觉越来越难了,拿不到OFFER了。
以后只要是北上广地区的游戏厂的难度都会提高吧。
---------------------------------3.28 23.46-------------------------------------------------------------
看了一下腾讯大佬的面经,还是看自己写的简历写了什么东西为主,自己不会的就不要给自己挖坑?但也有一些面经问的东西也比较正常。
总而言之自己简历上当你写上了游戏引擎就做好被问死的准备吧
----------------------------------------------------3.29-----------------------------------------------------------
昼观天象,恐时日无多。
如果这篇面经停更,我大概是没了,只能过好每一天。
各位牛油不要虚度光阴,要找到自己想要做的事。
夜观天象,该传承光了。
笔记本写面经写到一半,壮烈牺牲,悼念。面经传承到下一台电脑更新。
太多文章想收藏了。。歇一两周再更新文章收藏吧,看得眼花缭乱,之后也准备给收藏的文章分类,方便查找。
知乎搜索关键字:卡通渲染、罪恶装备、原神、崩坏3、战双、蓝色协议、二之国、NPR、PBR。。。。。。。。。。。。。。
3.31
感觉没OFFER了,该写面经传承光了。
乐狗游戏发来感谢信,真的烦。
TMD要面试那天,显卡被偷,去警察局报案了就取消了面试。
现在看到感谢信,一种绝望的感觉。。。
矿工、比特币必死。
----------------------------2021.4.1------------------
令人感叹,笔试的题很多我面经上都写到了,看到地图随机生成当场笑出声(随机游走算法警告),但是忘了C++怎么随机数生成只A了50,写了思路。
所谓的命运吧,上一个人的面经传承到我这里帮了我一把,我要继续把面经正道的光传承下去。
----------------------------2021.4.2-------------------------------------------
关于应用场景题答不出来这回事
比如子弹时间你没答上来降低全局速率这个方法,面试官这个时候嘲讽你。
这个时候请放平心态,并且保持礼貌的微笑。
大哥您搁这社招呢?我就一应届生我答不上这个方法不是很正常?
而且游戏引擎大概有几千几万个底层方法我鬼知道TMD用这个降低速率的方法。
我之前写的游戏都是斗地主哪用的上子弹时间。
这种问题答不上不是你没水平,而是面试官有问题。
当一个问题不具有普遍性的时候,答不上来是一个很正常的事情。
我就是没做过这个功能,我就是答不上,没什么办法,你可以问我我怎么做的思路但答不上现实中
应用的思路我也没法子。
当面试的时候被问到一大堆奇奇怪怪的应用题,答不上不用慌张,说出自己现有的思路就行。
好的应用题会倾向于让你发散性的思考解决问题的思路,而不是需要让你去记这个题目的标准答案。
***********************************五年春招,三年面经***************************************************
为了让各位牛客未来当面试官的时候,能够温柔待人,设计一套神仙面试问题:
1.Roguelike懂吗?随机地图怎么做?
2.RTS懂吗?自动寻路怎么做?
3.二刺螈懂吗?卡通渲染怎么做?
4.ACT懂吗?子弹时间怎么做?锁定敌人功能怎么做?
5.JRPG懂吗?回合制的战斗系统要你来编程,你怎么设计?怎么切换回合?
6.FPS懂吗?子弹速度快时,碰撞怎么做?击杀回放功能你怎么设计?
除射线碰撞外,你还可以怎么做?
7.要你设计一个抽卡系统,怎么保证抽卡的概率在某一个数值?
8.开放世界懂吗?地图加载需要考虑什么?要你设计加载系统怎么设计?
-------------------------2021.4.3---------------------------------------------------
应该是没游戏相关offer了,希望这篇面经能帮助到屏幕前的牛客吧。
------------------------------------------------------------2021.4.5----------------------------------------------------------------
最后的波纹,没OFFER了。总结一波春招。
总而言之,能秋招就秋招,不要只春招,春招就是噩梦级别。
秋招难度比春招低很多,春招可能一个小厂的难度都比任何一个秋招大厂难。
现在心情很绝望把,该准备在老家找个简单工作谋生了。
-----------------------------------------------------2021.4.8-----------------------------------------------------------------------------------
游戏科学给电话面试了,这辈子无憾了。
-----------------------------------------------------2021.4.10----------------------------------------------------------------------
想忽悠朋友投游戏科学,劝了半小时都不投。
我:???????时代变了。-
----------------------------------------------2021.4.11-------------------------------------------------------------
游戏科学面试体验真的很好,面试官很好人,西山居的面试官也很好人,大家都可以投。
---------------------2021.4.13--------------------------
单独把技术文章、访谈列成一个文章,好拓展
------------------------2021.4.16------------------------
没offer了,春招也结束了,希望这篇面经能帮到大家吧。
现在心情很难受,过完这两个月就没有然后了。
整理一下访谈文章,分类/
-------------------遗言部分---------------------------
心情很压抑,就在这里抱怨一下人生,感觉随时都有可能去死。
三月份开始春招,第一个挂的是XX厂,挂的不冤,但感受不到尊重,只感觉被耍了。
然后XX面试那天,显卡被偷了,去报案,然后没有面试机会,收到了XX的感谢信,感谢信内容好评,但自己感觉十分遗憾。
后面报了很多厂,面试都没过,XXX还被我自己给坑了给弄没了。
然后现在一个offer都没有,偷我显卡的小偷还逍遥自在,而我还在想着怎么找一个正儿八经的工作。
现在心情极度压抑,比特币这种司马玩意还没死,而我感觉我要死了。
春招体验最好的几家:Seasun、Legou、勇什
面试官很尊重人,感谢信写的也很让人舒服。
希望各位能拿到OFFER吧,我到头了。
可能是命运吧,没有游戏开发相关工作。
------------------------------2021.7.3--------------------------------
打算花点时间做个小游戏,之后找个小工作混饭吃。
高估了自己玩游戏和做游戏的热情。
希望看到这里的人能够认真思考自己是否喜欢游戏这件事。
也希望某些游戏厂商能早日倒闭去死。
------------------------------2022.10.16------------------------------
之前找了个小公司的U3D客户端做了一年,然后半年后喜提颈椎病,后面加班加的累还有十分厌恶手游7月离了职。
然后因为一些机缘巧合的事情,现在在一个独立游戏项目里打杂,也算个好结局吧,对于我来说只想做些自己想做的事情。
之后再补充一个面经以告诫世人。链接
全部评论
(37) 回帖