常见面时问题

常见面时问题
一.算法
1.冒泡排序
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
2.快速排序
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 [2]
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

3.二分查找

二.数据结构
1.数组Array[]
内存上连续分配,元素类型相同,通过下标访问,读取快,增删慢,长度不变。
2.动态数组ArrayList[]
跟数组的不同:长度可变,元素类型可不同,会有装箱操作
3.列表List<>
本质上是数组,长度不够时,申请此时长度的两倍的内存进行复制操作。
跟数组不同:泛型,类型安全,不定长,避免装箱拆箱,增删改查全是数组操作没有优化,好用但是效率低
4.链表LinkedList
泛型,内存不连续,每个元素有前后节点,节点值可以重复,不能下标访问,找元素只能遍历,查找慢,增删快
5.队列Quene
先进先出的链表
6.栈Stack
先进后出的链表(常用于返回上一级操作)
7.字典Dictionary
泛型,增删改查都快,类型不安全(对key value没有要求,因此涉及装箱拆箱),有序。
本质是两个数组之间通过哈希值一一对应,使用拉链法解决哈希冲突,容量扩充与List相同,
同样多线程不安全,需要自己加锁,与List一样最好在定义时指定长度,避免长度翻倍内存浪费。

三.优化
1.CPU优化(性能优化)
(1)缓存对象,不要频繁查找
(2)对象池,关闭场景关闭对象池
(3)测试代码,空的start update也会消耗内存;加载器不需要就卸载,
(4)避免CPU峰值,如同时实例化非常多的对象,提前加载实例化,协程每帧创建等手段。
(5)避免触发GC。使用profiler工具定位造成大量垃圾内存的函数进行优化。String的相关操作,变量的相关操作
(6)其他小地方: ①减少对粒子系统Play()的调用;
②处理Rigidbody时,使用FixedUpdate,设置Fixed timestep,减少物理计算次数;
③如果可以,尽量不用MeshCollider,如果不能避免的话,尽量用减少Mesh的面片数,或用较少面片的物体来代替;
④使用内建数组如使用Vector3.zero而不是new Vector(0,0,0);
⑤每次访问Transform.position/rotation都有相应的消耗。能cache就cache其返回结果;
⑥如果可能,尽量用Queue/Stack来代替List;
⑦同一脚本中频繁使用的变量建议声明其为全局变量,脚本之间频繁调用的变量或方法建议声明为全局静态变量或方法;
2. GPU优化(渲染优化)
(1)基础知识:
①一个draw call包含网格数据以及网格如何被渲染。在某些场景,共享设置的一些对象可能会被合并为一个draw call。合并不同对象的数据到同一个draw call被称作batching
②CPU会发出指令,使GPU改变一些渲染状态。这个指令被称为SetPass call。SetPass call通知GPU,如何去渲染下一个网格。只有在渲染下一个网格时,其渲染状态相对于渲染上一个网格发生了变化时,才会调用SetPass call。
③渲染优化的主要目的就是减少渲染的工作量,控制渲染的工作量是保证效率的根本,而每帧渲染的顶点数量是衡量渲染工作量最直观的标准之一:每帧可渲染的顶点数量主要取决于设备的CPU和GPU。 不过通常来说PC游戏每帧渲染的顶点个数不宜超过2M,移动游戏每帧渲染的顶点数量不宜超过0.1M。
(2)具体内容:
①如果是CPU限制,如SetPassCalls 或者Batches过多,可通过以下手段解决:
·减少渲染对象:降低摄像机渲染距离,使用遮挡剔除
·减少渲染次数:使用光照贴图,关闭不需要的阴影,谨慎使用反射探针
·合并渲染对象:使用静态合批,谨慎使用动态合批,使用GPUInstanceing,使用纹理图集
②如果是GPU限制,即Verts 、Tris过多,可通过以下手段解决:
·Shader优化
·纹理压缩:根据需要降低图片大小,改变压缩方式
·Mipmap/LOD:根据距离改变渲染精度
③UI优化
动静分离、过大的UI拆出来单独加载、UI预加载(只加载不实例化,避免加载高峰值)、打图集降低Drawcall、减小字体包省内存、Scrow优化(显示部分,格子对象池)、UGUI动画处理(改变颜色会导致UImesh重构,解决:新建材质使用UnityUIshader,改颜色时改此材质的属性来代替改图片的属性)、贴图设置(去除A通道、压缩方式、大小是2的倍数、关闭读写、关闭Mipmap)
四.渲染
1.渲染管线
三个阶段:应用阶段-几何阶段-光栅化阶段
应用阶段:CPU准备数据,即渲染图元,数据包括点线面等。
几何阶段:包括顶点着色器,曲面细分着色器,几何着色器,裁剪,屏幕映射五个阶段。
光栅化阶段:包括三角形设置,三角形遍历,片元着色器,逐片元操作四个阶段。
顶点着色器:Vertex Shader 完全可编程,通常实现顶点的空间变换,顶点着色等功能。
① 顶点坐标从模型空间转换到齐次裁剪空间
② 逐顶点光照,计算顶点颜色
曲面细分着色器:Tessellation Shader 可选着色器,用于细分图元
几何着色器:Gemetry Shader 可选着色器,可被用于逐图元的着色操作,或者用于产生更多图元。
裁剪:Cliping 裁剪掉不在摄像机视野内的顶点,并剔除某些三角图元片面。
屏幕映射:Screen Mapping 不可操作,每个图元转坐标换到屏幕坐标
三角形设置:固定函数操作,计算每个三角形网格需要的信息。上一个阶段输出的是三角形网格的顶点,现在这个是要计算三角形的面的信息。
三角形遍历:固定函数操作,检查每个像素是否被三角形覆盖,覆盖的话就生成一个片元fragment。使用三角网格三个顶点信息对整个覆盖区域的像素插值。并不影响每个像素的,只是记录影响此像素的信息。
片元着色器:有很多重要操作,如:修改颜色、深度缓冲、进行混合等,不可编程,但有很高的可配置性。根据上一步的信息,计算出一个或者多个颜色值。
逐片元操作:决定每个片元的可见性,如深度测试、模板测试;如果通过所有测试就混合片元颜色值和存储在颜色缓冲区的颜色。高度可配置,每一步都可以设置。
五.设计模式
https://www.cnblogs.com/zhaoqingqing/p/4288454.html
1.单例
2.监听者/广播
2.工厂
六.Shader
七.程序设计原则
八.Unity
1.相机三种模式:
screen-overlay Canvas在场景前,UI遮挡模型,此时多个Canvas想要调整渲染顺序就要用到Sort order参数了
screen-camera 模型遮挡UI之前 想用更多非UGUI元素可以用这个,每个Canvcas需要选中一个对应的相机
world space 把Canvas当成模型物体一起渲染,canvas和模型的世界位置会相互影响,主要用于想让UI显示在3D世界时,可以新建一个Canvas设置为worldspace,scale调整为1,相对模型坐标为0,就可以看到UI与模型一起渲染了
2.EventRTrigger 好用的组件
不用按钮但是想触发某些事件,比如鼠标移动到这个组件上,按下、抬起等动作的出发事件
在这里插入图片描述
3.Mask遮罩
遮挡组件,可以将其子节点下矩形区域外的内容剔除,是滚动窗口中最常用的组件。
九、其他问题
1.常用设计模式?六大原则?
https://blog.csdn.net/qq_30858573/article/details/78966958
https://www.jianshu.com/p/166593028911
单例模式、命令模式()、观察者模式、工厂模式、MVC模式
原则:
2.单例有什么好处?
保证数据唯一,但是多线程下懒汉单例模式仍然会出现数据不安全,此时可用线程锁或者使用饱汉模式
https://www.cnblogs.com/cdlyy/p/12846098.html
3.MVC模式
数据、显示、控制分离的模式会使软件(游戏)的结构清晰化,逻辑更明了。
M(Model)数据层,两个用途:1保存数据;2发送数据更新信息;
V(View)视图层,两个用途:1接受用户从界面上的操作;2根据M层的数据显示相应的界面;
C(Controller)控制层,两个用途:1处理和界面无关的代码逻辑;2接受和处理网络数据;
4.观察者模式
5.工厂模式(和对象池有什么区别?)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值