游戏开发面试准备
文章平均质量分 85
头号理想
四面佛保佑
展开
-
【游戏开发岗面经总结7】(函数调用底层,值捕获和引用捕获,宏定义和内联,排序算法稳定性,static,软工思想,sprite和image的区别,细小物体碰撞问题)
树的种类完全二叉树对于一颗二叉树,除了最外层可以不满,其他层上都是紧密排列平衡二叉树(AVL)左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是平衡二叉树二叉查找树(BST 二叉搜索树)没有相同的节点如果左子树不为空,则左子树上所有的节点均小于它根节点的值如果右子树部位空,则右子树上所有的节点均小于它根节点的值任意节点的左右子树均为二叉查找树红黑树特殊的 二叉查找树 具有二叉查找树的所有的特性每个节点都是黑色或者红色的,根节点是黑色 叶子节点为空的黑色节点树的路径上不能出现原创 2021-03-22 21:26:44 · 482 阅读 · 3 评论 -
两种同步模式:帧同步和状态同步
同步所谓同步就是要一个游戏中的所有客户端的表现效果是一致的就拿王者荣耀来说 十个玩家所有数据都是同步的,比如位置 技能cd 技能角度 单个英雄状态等 这个就是同步同步是一个网络游戏的概念,单机游戏是没有同步的概念的状态同步原理状态同步的战斗逻辑写在服务器端,包括技能释放,普攻,伤害,移动等等一系列内容由于核心逻辑必须知道一个场景中的所有实体的情况,所以就必须把战斗逻辑写在服务器端比如魔兽争霸的客户端承载有限,并不能把所有的地图的实体展现出来,所以客户端没有足够的信息计算全图的内容、状态同步原创 2021-03-20 16:44:29 · 1899 阅读 · 0 评论 -
【游戏开发岗面经总结6】(unity优化总结,全局变量和全局静态变量,NULL和nullptr的区别,拷贝构造函数和赋值运算符的区别,深浅拷贝,哈希碰撞,TOPK问题,野指针问题,堆和栈,内存泄漏)
unity优化UGUIUGUI的动静划分 尽量避免频繁增加和删除UI对象(降低界面更新频率)合理增加UI的深度以及不要图文交叉mask和Raycast Target属性尽量少的使用合理使用批处理代码尽可能少的使用foreach GetComponent尽量将string换成StringBuilder,多使用内建数组 如vector3.zero等代替vector3(0,0,0)udp可靠化确认机制,重传机制,滑动窗口udp不连接,消耗资源少,处理速度快,传输层无法保证数据的可靠传输,只原创 2021-03-20 11:15:05 · 861 阅读 · 0 评论 -
【游戏开发岗面试】A*算法
A*寻路来解决什么问题?A*寻路来计算玩家行进最短路径A*基本原理不停的找周围的点,选出一个点作为起点,再循环的找,知道找到终点A*详细原理1.寻路消耗公式f(寻路消耗)=g(离起点距离)+ h(离终点距离)2.开启列表(所有点的存放)3.关闭列表(最优点的存放)每次判断最优点是否为终点 如果是 停止寻路,否则继续寻路4.格子对象的父对象(用来确定最终的路径)需求分析需要一个格子类 寻路管理器(管理所有的格子)开启列表 关闭列表格子类成员变量:寻路消耗 f g h父亲格子f原创 2021-03-08 11:23:18 · 1141 阅读 · 3 评论 -
【游戏开发岗面经总结5】(面相对象和面相过程的区别,多态,CG,设计模式,进程线程协程,动静态合批态,内存区域存放,指针和引用的区别,防止对象被拷贝,map和unordered_map)
我发现真的是好多东西 脑子里知道这个东西的大致,但是如果让你说出来 真的半句话憋不出来所以我们还是得脚踏实地的一个问题一个问题的看 不能好高骛远面相对象和面相过程的区别1.面相过程是以过程为中心的编程思想,面相对象是以对象为基本程序结构单位的程序语言2.面相过程是分析出解决问题的步骤,然后一步一步实现,一次一次调用面相对象是对象具有唯一的静态类型,和有可能的多个动态类型,共享数据和操作3.面相过程不支持面相对象的特性(多态,继承) 不允许混合持久化状态和逻辑面相对象 在内部被表示为一个指针,任原创 2021-03-05 15:24:06 · 2452 阅读 · 8 评论 -
【游戏开发岗面经总结4】(DrawCall,c++11新特性)
DrawCall?一提到DrawCall 我们就会想到优化的问题什么是DrawCall?在unity中,每次CPU都会准备数据通知GPU的过程就成为一个DrawCall具体:设置颜色-绘图方式-顶点坐标-绘制-结束如果可以在一次DrawCall完成所有的绘制,就会大大提高运行效率 从而达到优化的目地DrawCall为什么影响游戏运行效率?每次调用DrawCall之前,CPU向GPU发送很多内容,包括数据,渲染状态,命令等等1.准备渲染对象,将渲染对象从硬盘加载到内存,然后从内存加载到显存,原创 2021-03-04 16:51:19 · 510 阅读 · 1 评论 -
计算机网络面试题汇总(快拿去背吧)
三次握手 四次挥手三握四挥是计算机网络中可以说是最高频的考点了三次握手第一次握手: 建立连接的时候,客户端A向客户端B发送SYN包,并且进入SUN_SEND状态 等B服务器B确认**第二次握手:**服务器B收到A发送的SYN包,确认A发送的SYN包,然后向A发送一个SYN+ACK包 而且B进入SYN_RECV状态**第三次握手:**服务器A收到ACK_SYN包,然后向B发送ACK包 并且客户端A和B都进入RSTABLISHED状态三次握手完成四次挥手第一阶段:客户端发送完数据之后,向服务原创 2021-02-03 20:22:13 · 579 阅读 · 0 评论 -
c++四种类型转换
c++有四种类型转换的方式const_cast用于去掉const或者volatile说到了const 在这里提一下const简单理解:const的目的就是定义一个“不会被修改的常量”,可以修饰变量,指针,引用,函数参数等等使用const可以减少代码出错的概率,int main() { struct T { int i= -1; }; const T a; //a.i = 100; T& b = const_cast<T&>(a); b.i = 10原创 2021-01-14 16:59:52 · 367 阅读 · 0 评论 -
【游戏开发岗面经总结3】(c#托管和非托管类型,链表和数组的优缺点(顺序存储和链式存储),红黑树的特性,c#的拆装箱,static关键字,c++类型转换,const关键字)
c#托管和非托管类型GC当系统内存资源匮乏的时候,他就会被蒸发,然后自动的去释放那些没有使用的托管资源托管就是GC帮你管理内存以及资源的释放,不需要程序员自己去控制,对象值针对于托管资源,不回收非托管资源比如数组,用户定义的类,接口,委托,object,字符串等引用类型,栈上保存一个地址,当栈释放之后,对象也就没有用了但是int string float 等的值类型,GC会自动释放其内存,不需要GC来回收对于非托管资源,GC只能跟踪非托管资源的生存期,而不知道如何释放它这样就出现了资源使用不尽的原创 2021-01-06 21:14:33 · 392 阅读 · 1 评论 -
【数据结构——红黑树】
前不久我刚刚更新了一篇关于数据结果中树的博文:博文地址可能对于好多对树的结构不是很了解的朋友有些帮助然后红黑树是面试环节中经常出现的问题所以我今天也是专门写一篇关于红黑树的博文(方便我自己查阅也可能对大家有帮助)学习红黑树之前首先要了解二叉查找树二叉查找树特性:1.左子树上的所有节点的值小于或等于根节点的值2.右子树上所有节点的值大于或等于根节点的值3.左右子树也都为二叉排序树下面为例二叉搜索树的特点二叉搜索树在查找所需的最大次数就是二叉树的高度在插入节点的时候也是利用类似的方法,原创 2020-12-31 16:54:53 · 163 阅读 · 0 评论 -
游戏研发岗面试中对于c++常遇到的问题(1)(析构函数,const关键字)
析构函数c++中类的析构函数是类的一种特殊的成员函数,在每次删除所创建的对象的时候执行析构函数不像构造函数一样可以带参数,析构函数不可带参数析构函数的名称和类的名称是完全相同的,前面加了(~)做前缀,不会返回任何值析构函数有助于在跳出程序(关闭文件,释放内存)前释放资源class Line{public: Line(void) { cout << "该对象被创建" << endl; } ~Line(void) {原创 2020-12-30 16:12:22 · 187 阅读 · 0 评论 -
【数据结构——二叉树】(其他树的种类)
当时大一上课没有好好学,现在追悔莫及,因为面试需要数据结构的知识,所以只能补上去了还是建议大家像这样考研和工作都要用到的知识还是在上课的时候好好学然后之后也会轻松一些二叉树的基本操作我这里用的c++语言有一些面相对象基础的朋友们都可以看懂的节点类class Node { public : int key;//位置 int value;//值 Node* leftchild; Node* rightchild; Node (int key, int value) { this-原创 2020-12-29 17:27:36 · 227 阅读 · 0 评论 -
c++和c#中的STL底层(List,ArrayList,hashmap,vector等底层知识)
数组和List和ArrayList的异同在实际开发过程中我们可能对于数组和ArrayList还有List不以为然但是他们之间还是有很大的区别的数组数组在内存中时连续存储的,所以其索引速度非常快,而且赋值和修改元素也比较简单但是数组也有一些不足的地方,比如在一个数组中的两个数据中插入一个元素,是比较麻烦的我们在声明一个数组的时候,必须同时指明数组的长度,数组长度过长会导致内存浪费数组长度过短,回导致数据溢出的错误所以在声明数组的时候,我们是必须权衡一个比较完美的数值c#中提供的ArrayLi原创 2020-12-27 21:47:02 · 1278 阅读 · 0 评论 -
【游戏开发岗面经总结2】(TCP拥塞控制,静态动态链接,TCP和UDP不同点,结构体和类区别,值类型和引用类型,c#中的GC)
TCP中的拥塞控制在TCP传输过程中,发送端开始发送数据的时候,如果刚开始大量发送数据,那么可能造成一些问题,网络可能在开始的时候非常的拥堵,如果给网络中再次加入大量的数据,那么这个拥堵就会加剧。拥堵加剧会产生大量的丢包,就会产生大量的超时重传,严重影响传输速率所以TCP引入了慢启动机制,在开始发送数据的时候,先发送少量的数据探路,探清当前的网络状态如何在决定使用多大的速度进行传输**拥塞窗口:**发送刚开始定义拥塞窗口为1,每次收到ACK应答 拥塞窗口加一在发送数据之前,首先将拥塞窗口和接收端原创 2020-12-26 20:52:21 · 329 阅读 · 0 评论 -
【游戏开发岗面经总结1】(局部变量存放,new和melloc区别,进程线程,进程间的通讯,多进程多线程,TCP和UDP的使用时机)
局部变量存在哪?局部变量保存在栈内存区栈内存区的地址是连续的,由系统控制速度较快堆内存区的地址时不连续的,它是把系统中空闲的内存连接起来的链表栈是系统根据变量自动分配大小的堆中分配内存是通过malloc函数或者是new来申请分配用户使用malloc或者是new申请内存的时候,找到第一个满足大小的空间,即从链表中删除这个节点之后就分配给用户使用,没有栈内存使用快,但是很灵活new和malloc的区别1.首先是属性上的区别,new是编译器支持的,malloc是头文件支持的2.参数的区别 ma原创 2020-12-21 16:14:54 · 545 阅读 · 0 评论 -
c++中的map和unordered_map
在c++中有两种map分别是普通map和unordered_map其中他俩的用法基本相同 但是其中还是有很多不同的地方map和unordered_map的优缺点,适用于什么场景?mapmap的底层是基于红黑树实现的**优点:**有序性,这是map最大的有点,其元素的有序性在很多应用中都会简化很多操作map的查找,删除,增加等一系列操作的时间复杂度稳定,都为logn缺点:查找 删除 增加等操作的品骏时间复杂度较慢,与n相关unordered_mapunordered_map的底层基于哈希表原创 2020-11-28 12:01:01 · 745 阅读 · 0 评论 -
unity外观模式
外观模式外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用优缺点优点:1)外观模式对客户端屏蔽了子系统组件,从而简化了接口,减少了客户端处理的对象数目并使子系统的使用更加简单。2)外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组原创 2020-09-03 15:51:21 · 309 阅读 · 0 评论 -
unity3D优化(全面版)供学习或面试总结使用
关于unity3D的优化问题 我之前我写过一些博文今天我把所有的方面总结一下unity优化要从哪方面开始着手提到优化,很多人想到就是无脑降低DrawCall的指标 但是这个指标并非全部我们优化的时候要注意三个方面1.CPU方面 2.GPU方面 3.内存方面CPU方面DrawCall是知名度最高的优化点 但是除了DrawCall还有一些需要的优化的地方1.DrawCalls 2.物理组件 3.GC 4.脚本代码的质量对DrawCall优化DrawCall是CPU调用底层图形的接口 比如有上原创 2020-09-02 15:42:58 · 866 阅读 · 0 评论 -
c#中类和结构体的区别和使用环境
区别首先结构体的类型是值类型,类的类型是引用类型结构体存储在栈中 类存储在堆中栈的空间小 但是访问速度快堆的空间大 但是访问速度相对较慢结构体不能继承 不能创建构造函数 结构成员不能指定为抽象(abstract) 虚(virtual)保护(protected)类型结构体所构造函数必须为所有值赋初值所以:结构体一般存储轻量数据 类一般存储相对复杂的逻辑结构的数据使用环境:当堆栈的空间有限 且需要大量的逻辑对象的时候 创建类比较好一些对于颜色这种轻量类型的时候 假如是一个声明颜色的数组原创 2020-08-25 09:58:15 · 388 阅读 · 0 评论 -
ArrayList和List的主要区别
主要区别就是ArrayList不安全List和ArrayList的用法是不同的 List<int> a = new List<int>(); ArrayList b = new ArrayList();一般我们在写程序的时候用到ArrayList很少,虽然ArrayList规定其类型默认就是object,功能很强大但是如果你要使用b.Add(a);这句话这里就包含了装箱的操作(把a转换成为object) 拆装箱是很消耗内存的我之前写过的一篇关于拆装箱的博客链接原创 2020-07-29 09:25:04 · 4944 阅读 · 1 评论 -
c#的值类型和引用类型(拆装箱)
1.值类型和引用类型1.管理机制值类型:操作系统负责,作用域结束时被操作系统自动释放引用类型:垃圾回收器负责2.内存分配值类型:值类型实例总会被分配到变量声明的地方声明的是局部变量 被分配到栈上声明的是引用类型成员的时候被分配到管理堆上引用类型:实例总被分配到托管堆上变量存储在栈中3.赋值方式值类型:复制变量包含的值引用类型:复制对象引用(地址)4.基类值类型:继承System.ValueType;System.ValueType又继承自System.Object引用类型:引用原创 2020-07-28 17:19:08 · 573 阅读 · 0 评论 -
unity动态加载(1)Resources加载方法
在开发过程中我们很可能需要使用到动态加载这样一方面可以节省性能 另一方面使我们的开发过程更加便捷我之前写过一篇游戏中音效控制器 可以很方便的播放音效 就是用Resources传送门大家如果有兴趣可以参考然后这篇博客实现以下使用Resources.load来动态加载预制体以及给我们的Image或者是RawImage或真实SpriteRenderer来赋值首先创建一个文件夹Resources(名字一定一定不要写错)然后我们首先实现Image等的赋值实现Image RawImage Sprite原创 2020-07-20 10:12:49 · 1228 阅读 · 0 评论 -
unity的UGUI的Raycast Target的使用(优化)
我之前写过一篇博客是关于unity的UGUI的内存优化的里边提到一点点关于Raycast Target传送门这篇博客介绍一下Raycast Target的使用和内存优化的方法首先我们要知道哪里有Raycast Target 这个东西我们可能不太会注意但是的确有用 在Image和text里默认勾选 虽然很不起眼 但是他会消耗不必要的内存但是如果一味的全部取消 会出现问题测试首先我们创建一个工程 然后创建一个按钮然后创建出来之后 是一个按钮 下边一个text我们给他注册事件当我们把两个的R原创 2020-07-19 18:25:36 · 8378 阅读 · 0 评论 -
对于Unity的UGUI的优化以及面试可能遇到关于UGUI的问题
1.对于UGUI中的Image和RawImage的区别在unity中简单的有两种Image 一种是简单的Image 还有一种是RawImage这两种从用发上看RawImage的功能更强大 但相对的也更加消耗性能在导入图片时 系统默认TextureType时为Default类型的但是Image只能使用Sprite (2D and UI)类型的图片,这样就相对于Image有了局限性但是对于RawImage来说 他需要的类型是Texture 类型的这样就没有了局限性在一些相对限制的项目中就能省去一大原创 2020-07-19 14:56:57 · 4274 阅读 · 1 评论 -
c++中处理字符串的空格和包含关系
最近刷题遇到很多关于字符串的问题 因为刚用c++刷题不久然后遇到了一些困难之后看了大佬的代码了解了两种处理的方法在这里分别介绍一下1.有空格的字符串分开存放在数组中这个用代码去扫一遍字符串然后判断空格也很简单但是还有更简单的方法在c#中有一个split的方法可以直接分开在c++中我们可以用istringstream来实现int main(){ string a = "sdfsa sdfdaf dsferw dfghth"; istringstream word(a);原创 2020-06-16 10:47:42 · 833 阅读 · 0 评论 -
对c++中的哈希表(map)分别根据key和value排序
因为刚刚接触c++不是很久 在用的时候有些困难然后今天在刷题的时候 遇到一个需要对哈希表排序的操作然后研究了很长时间在这里和大家分享一下可以根据不同的要求 对于key和value来排序里边需要用到pair的知识 这个方法可以用偷梁换柱来形容我们就用vector<pair<int,int>>来代替map<int,int>...原创 2020-06-07 16:51:05 · 7624 阅读 · 3 评论 -
unity脚本生命周期和执行顺序
最近我也开始为将来的面试做准备了然后我会更新一系列关于unity底层的知识就从今天这篇开始unity脚本生命周期Awake 脚本实例被创建时调用 用于游戏对象的初始化,注意Awake的执行早于所有脚本的Start函数OnEnable 当对象变为可用或激活状态时被调用Start Update函数第一次运行之前调用 用于游戏对象的初始化Update 每帧调用一次 用于更新游戏...原创 2020-05-03 17:18:58 · 4011 阅读 · 2 评论