最全中级Unity面试题(引擎,渲染,Lua等)

打算年底找工作,所以趁着年前整理波面试题。下面是部分内容,更多内容可以通过底部关注我的公众号获取。

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 的调用频率等。

更多面试内容可以关注我的公众号,回复"面试"即可领取

另外公众号内还有很多关于独立游戏相关的内容~~~

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zero游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值