1.如何关闭协程?
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。
1.StartCoroutine("test");
StopCoroutine("test");
2.StartCoroutine(test());
StopCoroutine(test());
3.StopAllCoroutines();
2.协程对象被销毁 是否会结束?
找不到处理的对象会报错。
3.协程要是死循环 也会卡死?
会卡死。
4.如何降低drawcall?
批处理;
动态合批:不需要操作,同一材质,unity自己会处理,但是限制多,最多顶点数900个的网格,大于的话无法处理,如果包括了顶点 法线 纹理等,顶点数不能超过300.多pass的shader也会中断动态合批.
静态合批:同一材质,但是不能移动,内存会增加。
5.ab包加载 的时机?
什么是ab包,资源音频等打成一个个ab包,然后加到对应的位置,主动调用。
6.包体优化?
包体大小控制,比如定在控制在200m以内。
图片、音频、视频、字体等压缩,保留必要资源,其他的场景、玩法资源走ab包加载。
图片对应的压缩压缩,按照2的次幂大小,达成合图,分成功能图集,公用图集等。是否使用透明度,是否使用mipmap这些。
压缩方式:ios使用pvrtc,pc使用dxt5,android使用etc2.
音频的话:是否使用单声道。
字体:保证常用的字体大小。
7.awake start 时机?
Awake——>OnEnable–>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy
8.update fixupdate lateupdate?
MonoBehaviour.Update 更新
当MonoBehaviour启用时,其Update在每一帧被调用。
MonoBehaviour.FixedUpdate 固定更新
当MonoBehaviour启用时,其 FixedUpdate在每一帧被调用。
处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)
MonoBehaviour.LateUpdate 晚于更新
当Behaviour启用时,其LateUpdate在每一帧被调用。
LateUpdate是在所有Update函数调用后被调用。这可用于调整脚本执行顺序。例如:当物体在Update里移动时,跟随物体的相机可以在LateUpdate里实现。
9.A脚本早于 b脚本执行?
设置脚本的执行顺序。
10.不透明 和半透明的渲染顺序?
西安许安然不透明的,避免不透明的挡住了透明的。
backgroud:2000
transparent:2450
opaque:3000
overlay:5000
11.Animation 和 animator?
animation属于老的动画系统,animator是新的动画系统,可以使用状态机来编辑动画。
12.forwardbase说说?
基本的渲染光照模型,主要是平行光和点光源的渲染。
13.图片资源优化?
1.图片的合图打成2的次幂;
2.使用正确的压缩算法;
3.打成ab包加载;
14.ab包如何释放 和加载 唯一性 相互关联的?
ab包加载到内存里面就可以释放,将ab包分隔的细致,保证之间没有相互引用。
ab包资源直接会有一个依赖表。
15.多线程的同步?
多线程直接会有消息通信,通过加锁来保证资源的正确性。
16.unity 插件?
很多。比如动画的dotween,leantween,tween,itween.localization.
17.新特性?
18.gameobject和prefab
可以说所有的控件都是gameobject,
19.ref参数和out参数是什么?有什么区别?
ref和out参数的效果一样,都是通过关键字找到定义在主函数里面的变量的内存地址,并通过方法体内的语法改变它的大小。
不同点就是输出参数必须对参数进行初始化。ref必须初始化,out 参数必须在函数里赋值。ref参数是引用,out参数为输出参数。
20.什么叫动态合批?跟静态合批有什么区别?
如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的,并不需要你进行额外的操作。
区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。
静态批处理:自由度很高,限制很少,缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。
21.简述StringBuilder和String的区别?
String是字符串常量。
StringBuffer是字符串变量 ,线程安全。
StringBuilder是字符串变量,线程不安全。
String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,
如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String类型。
StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。
这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。
22.TCP和UDP还有http的理解?
tcp和udp都是网络通信协议,分成长连接和短连接。一般对于实时网络连接不强的可以使用http连接,比如棋牌,如果要求实时性的话,比如rpg,mmo那使用tcp或者udp。
tcp每个包都需要回包,udp只会发出去不需要每个包都会回包。
kcp,稳定的tcp。
23.UGUI NGUI ONGUI FairyGUI的理解?
UGUI是Unity自带的UI框架,Ngui是一个插件,他有自己的渲染方式。
ongui主要用来做编辑器的开发,每帧调用,效率过低。
fairygui对于美术友好,可以让美术拼接好,程序负责逻辑实现。
24.编辑器的开发?
编辑器的开发主要使用ONGUI,做一些插件等的功能。
25.shader的使用?
一个材质对应一个shader,来对ui进行控制来实现一些定制化的需要。比如后处理效果,pbr的效果等。
利用shader实现动画等。
26.后处理效果知道吗?
在渲染的最后对成像进行一些处理,比如bloom,边缘检测、高斯模糊,npr效果,雾效等。
27.PBR知道吗?
基于物理材质的渲染。
28.SRP和HDRP了解吗?
SRP可编程的渲染管线。
Scripting Rendering Pipeline
HDRP 高清渲染管线。
29.光照说一下?
lightmode:forward defered.forward:forwardbase forwardAdd
30.Alpha Test和Alpha Blend说一下?
Alpha Test alpha检测,clip 要么是透明,要么就是不可见。
Alpha Blend透明度混合,颜色混合到一起,可以透过透明度来看。
31.用过哪些设计模式说下?
框架的mvc分离,但是代码之间会比较耦合,mvvm model view viewModel
32.对象池的使用?
对于重复创建和大量使用的东西创建对象池,避免频繁的创建和使用。
33.AssetBundle如何使用的,时机是什么?
ab包主要是打包大批量的资源文件,可以实现动态加载。
34.UI是如何管理的?
通过统一的UImanager统一管理。初始化的时候创建UIManager的管理对象,后面使用界面的时候注册到这个单例对象里面来管理。
35.网络通信是怎样的?
网络通信主要同过tcp或者udp,tcp相对于udp比较稳定,等到回包之后才继续发送下一个包,会有等待,但是会阻塞,网络不稳定的时候可能会卡住。对于延迟要求比较大的游戏使用udp,如果不用那么实时的可以使用tcp,比如卡牌,棋牌游戏。
udp的话不会校验包,只管发送,如果没有接收到回包,后面会重复发送,对于实时要求比较高的游戏,使用udp比较好,比如王者荣耀,枪战类型游戏。
kcp,是可信任的udp.
36.断线重连的机制?
当心跳包长时间没有,没有回应的时候,会重新走tcp udp连接的逻辑。
37.热更制了解吗?ILRuntime、ToLua 、Xlua都了解吗?
不需要重新下载包体,可以在当前包得到最新的游戏内容的更新叫做热更新。纯c#的更新有个事ILRuntime.
通过脚本的更新有ToLua和XLua.
38.粘包如何处理?
粘包了,可以重新在发送。
39.内存管理?
内存创建了,在销毁界面的时候一起销毁。
固定时间销毁。
40.垃圾回收机制?
内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。
要想了解垃圾回收如何工作以及何时被触发,我们首先需要了解unity的内存管理机制。Unity主要采用自动内存管理的机制,开发时在代码中不需要详细地告诉unity如何进行内存管理,unity内部自身会进行内存管理。这和使用C++开发需要随时管理内存相比,有一定的优势,当然带来的劣势就是需要随时关注内存的增长,不要让游戏在手机上跑“飞”了。
image.png
网友评论