打算年底找工作,所以趁着年前整理波面试题。下面是部分内容,更多内容可以通过底部关注我的公众号获取。
1.UI的优化方案
记录最全面的ugui优化策略_bommy游戏的博客-CSDN博客
2.图集的压缩格式
3.减少GC的方式
Unity优化之GC——合理优化Unity的GC - zblade - 博客园
Unity GC垃圾回收机制_小程小程,永不消沉-CSDN博客
4.动态批处理与静态批处理相关
关于静态批处理/动态批处理/GPU Instancing /SRP Batcher的详细剖析 - 知乎
Unity的静态批处理和动态批处理_Hello Mingo-CSDN博客_unity 批处理
最近面试遇到的静态合批合静态合批?简单整理一下; - 代王是我 - 博客园
5.内存泄漏原因,危害,解决方案
深入浅出再谈Unity内存泄漏 - 简书
6.资源加载优化分析,解决
Unity加载模块深度解析(纹理篇) - UWA Blog
关于Unity加载优化,你可能遇到这些问题 - UWA Blog
7.unity中的深浅拷贝
Unity对象的所有组件深拷贝与粘贴_cartzhang的专栏-CSDN博客
8.unity中碰撞检测机制
深入理解Unity的碰撞检测机制 - 简书
9.unity中常见性能问题,解决分析
Unity问答-性能调优_王利威的博客-CSDN博客
10.GC回收算法,原理
C#技术漫谈之垃圾回收机制(GC)(转) - nele - 博客园
11.一条射线,一个面,如何检测相交的点(射线检测原理)
12动态合批的条件是什么?会造成开销么?如果会,开销有哪些?
- Dynamic Batching 是在物件小于300的条件下(不论物件是否为静态或动态),在使用相同材质球下,unity就会自动帮你合并成一个Batch送往GPU来处理。
- unity在运行的时可以将一些物体进行合并,从而用一个绘制调用来渲染他们。这一操作我们称之为“批处理”。一般来说,unity批处理的物体越多,你就会得到越好的渲染性能。
- 动态批处理操作是自动完成的,并不需要你进行额外的操作。
- 批处理动态物体需要在每个顶点上进行一定的开销,所以动态批处理仅支持小于900顶点的网格物体。
- 预设体的实例会自动地使用相同的网络模型和材质。
13.静态合批的原理是什么?会造成开销么?如果会,开销有哪些?
- 静态批处理:游戏导出时,在player setting中勾选static batching,导出包的时候就进行批处理,导出来的包就会比较大。 在游戏场景中勾选场景的static选项,在加载场景时,会进行一次静态批处理合并,导出来的包不大,但加载时会使内存变大。
- 场景中有4个物体,如果都勾选静态选项,在进行静态批处理的时候,引擎会判断这4个物体是否共用同一渲染材质。如果共用同一渲染材质,则会将这4个物体视为可批处理的对象,引擎会基于单个渲染对象的大小拷贝出3个,共变为4个人Mesh,这时4个Mesh会存在一个indexbuffer中,会让资源占用内存变大4倍,在渲染的时候,是将这个更大的mesh传递给GPU进行渲染操作的。
- 如果CPU的运行速度较慢,则GPU会出现等待CPU的情况,此时哟咻主要受CPU的限制。 CPU在游戏中的主要作用是设置渲染状态和调用DC,如果每个物体的材质和贴图都不一样,CPU主要工作就是设置物体的渲染状态,调用DC也会更多,此时渲染状态的改变更消耗性能,游戏运行会变慢。所以,对于大量的不需要改变位置的物体,都会采用静态批处理的方式解决渲染状态的瓶颈。
14.Unity 协程和线程,进程的区别
- 其实很简单,首先需要理解进程和线程是怎么一回事:进程是Windows系统中的一个基本概念,他包含着运行一个程序所需要的基本资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。
- 进程和线程的区别通过以上,一目了然。
- 再谈谈线程和协程的区别。一般应用一个应用程序只使用线程这一“资源”。
- 需要明确,Unity只使用了一个线程,但是,我们需要”同时做很多事“,那Unity作为单线程,该如何去做,协程,就来了,协程是一种”伪线程“。 协同程序(coroutine).,即协作式程序,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协成处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CPU进行分时,协程可以访问和使用unity的所有方法和component。
- 同一时间只能执行某个协程,协程适合对某个任务进行分时处理。
- 控制代码在特定的时间执行。
- 协程不是线程,也不是异步执行,跟Update一样,在主线程中执行。
- 不用考虑同步和锁的问题。
- 协程是一个分部组件,遇到条件(yield return)会挂起,直到条件满足才会被唤起执行后面的语句。
15.第一次执行GameObject.Instantiate的时候有明显卡顿,该怎么解决?
Instantiate的卡顿与三部分开销相关:相关资源加载、脚本组件的序列化和构造函数的执行,并且绝大部分原因均是相关资源加载导致。所以,我们的建议如下:
1、通过 Profiler 查看 Instantiate 具体的CPU分配情况;
2、如果是资源加载导致的性能瓶颈,则一方面通过简化资源来缓解CPU耗时压力,另一方面通过 AssetBundle 依赖关系打包将资源预先加载,即将此处 Instantiate 的总体耗时拆分,平摊到之前帧进行执行(比如切换场景处等),从而让 Instantiate 实例化操作的局部耗时更加平滑;
3、如果是脚本组件序列化导致的性能瓶颈,则可尝试减少脚本中的序列化信息;
4、如果是构造函数的执行导致的性能瓶颈,一般只能在策略上进行规避,比如降低 Instantiate 的调用频率等。
更多面试内容可以关注我的公众号,回复"面试"即可领取
另外公众号内还有很多关于独立游戏相关的内容~~~文章来源:https://www.toymoban.com/news/detail-428433.html
文章来源地址https://www.toymoban.com/news/detail-428433.html
到了这里,关于最全中级Unity面试题(引擎,渲染,Lua等)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!