面经-Unity相关
本文最后更新于:2024年12月27日 下午
Unity生命周期
1、静态构造函数
当程序集被加载的时候就被调用了,如果你的unity处于编辑状态时,此时你保存一个脚本(从而迫使重新编译),静态构造函数会立即被调用,因为unity加载了DLL。并且它将不会再次运行,永远只会执行一次,unity运行时,是不会再次执行了!在一个已部署的游戏上,这个构造器将会在unity加载过程的早期被调用!
2、Awake
只会被调用一次,在Start方法之前被调用! 主要用于字段值的初始化工作,禁用脚本,创建游戏对象,或者 Resources.Load(Prefab) 对象
3、Start
只执行一次,在Awake方法执行结束后执行,但在Update方法执行前执行, 主要用于程序UI的初始化操作,比如获取游戏对象或者组件
4、Update
每一帧执行的,监听用户输入,播放动画,当机器忙或者性能差的时候,他会停止执行,会产生停顿的感觉,例如一个人本来在1米的位置,突然到了5米的位置上,产生了跳帧,而下面的FixedUpdate方法则相反!会一米一米的去执行!(自己调试发现,Update是先于OnGUI执行的,且执行一次Update之后,会执行两次OnGUI)
5、FixedUpdate
不管当前机器忙不忙,都会保证每一帧执行一次!避免跳帧!固定更新。固定更新常用于移动模型等操作。
6、LateUpdate
先执行Update,然后才去执行lateUpdate(Update方法执行完,必定接着执行LateUpdate,而Update和FixedUpdate方法的执行顺序不确定,而且有时候FIxedUpdate执行了多帧,而Update却只执行了一帧,这就是因为跳帧的缘故造成的(取决于你的机器性能)!),如果现在有100个脚本,分别有100个 Update()函数,其中只有一个LateUpdate,那么在同一帧中,等待100个Update()执行完后,才执行这一个LateUpdate()。
7、OnGUI
在这里面进行GUI的绘制,且GUI是每帧擦除重绘的!仅仅只是绘制!没有生命周期的概念!所有关于绘制GUI的代码,都要直接或者间接地写到OnGUI方法中!
8、OnDestroy
当前脚本销毁时调用
9、OnEnable
脚本可用时被调用、如果脚本是不可用的,将不会被调用!
11、OnDisable
如果脚本被设置为不可用将会被执行,程序结束时可用的脚本也会执行一次这个方法
OnEnable 和 OnDisable 只受脚本的可用状态的影响(enabled),而 OnBecameVisible 和 OnBecameInvisible 是受对象是否可见的影响!即使脚本设置为不可用,OnBecameVisible 和 OnBecameInvisible 也会被执行,主要是看对象是否在场景中显示了!
UI
ugui
rebatch和rebuild
Canvas(画布),和名字一样,是 UI 绘制的地方,Unity 的渲染系统用其来提供一个可绘制的分层几何。负责将ui几何合批成适合的网格,提交绘制命令给 Unity 的图形系统,这整个过程叫做 rebatch 或者 batch build。当 Canvas 其子节点下包含 Canvas Renderer 的节点需要进行 rebatch 的时候,就会被标记为脏。
Graphic 与 Layout 都依赖于 CanvasUpdateRegistry 类。它会定位 Graphic 与 Layout 是否需要更新并加入更新队列,在所在 Canvas 的 willRenderCanvases 事件被触发时对队列中的对象执行真正的更新。
图集有什么用,适用场景。
定义
图集是将很多零碎的2D小图整合成一张大图,方便unity渲染合批,降低渲染消耗。
优势
1.UI的合批处理,减少DrawCall
多张图片需要多次DrawCall,合并成一张大图只需要调用一次DrawCall
2.减少对内存的占用
OpenGL每张贴图都需要设置为2的N次方才能使用,假设有宽高分别为100x100、10x10的两张图片,如果不合成大贴图,那么就需要分别使用128x128和16x16的图片,会浪费一部分内存空间。
如果是使用一张大图的话,就可以将两张图片打到128x128的图集,进而减少内存的占用。
3.提升效率
图片尺寸为2的次幂时,GPU处理起来会快很多,小图不可能做不到每张图都是2的次幂的,但打成一张大图就可以。
https://blog.csdn.net/z2014z/article/details/119654256
屏幕自适应方案
canvas scaler
锚点
批处理和drawcall
Unity渲染优化的4种批处理:静态批处理,动态批处理,SRP Batcher 与 GPU Instancing - acnestis的文章 - 知乎
常用的Unity Atrribute
笔试题
unity脚本生命周期函数。
Lerp作用
欧拉角计算,Quaternio.Euler。
常用的Unity Atrribute
如何判断是否碰到了场景中的物体?
Coroutine有什么用,优缺点
发生碰撞的必要条件。
ugui如何保证分辨率改变ui大小不变。
C#List底层数据结构,增加和删除时间复杂度。
结构体和类的区别。
引用类型和值类型分别有哪些。
装箱和拆箱是什么,为什么不要频繁适用?
简单用代码实现一个单例模式。
观察模式读代码写结构,用在哪里?
频繁地对字符串进行分割,写一个代码。(就是分数比如说100000,分成100,000这样)
分批手段和适用场景。
渲染管线
渲染管线就是一系列处理数据的过程
应用程序阶段
Unity会知道要渲染哪些模型,还有光源相机的信息也会输入进去,然后就会进行剔除,使用AABB包围盒,只要有一个顶点在摄像机的可视范围里面,就不会剔除,然后把这些输入进GPU里面。
几何阶段
这个阶段是可以编程写shader的阶段,主要是把空间中的网格顶点编程屏幕上的网格顶点。顶点着色器,对每一个顶点都进行操作,可以简单的传递到下一个阶段,也可以做一些几何变换或者光源颜色相关的变换。
细分着色器,几何着色器,图元装配