整理的Unity 面试题(有些没答案都是师兄在脑海里记录下来的)(四)(第四点到第十二点是我自己面试游戏公司客户端开发工程师的真题)

一、Vertex Shader是什么,怎么计算?

Vertex Shader 中文意思就是顶点着色器,是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。

二、动态批处理是什么?跟静态批处理有什么区别?

如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。动态批处理操作时自动完成的,并不需要你进行额外的操作。

区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。静态批处理就不一样了,自由度很高,限制很少,缺点是可能会占用更多内存,而且经过静态批处理后的所有物体都不可以再移动了。

三、Unity3D Shader 分为哪几种,有什么区别?

表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色,表面着色器可同时在前向渲染及延迟渲染模式下正常工作。

顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。

固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行哪些酷炫的Shader的时候,还可以通过固定功能管线着色器来绘制出一些基本的内容。

四、你上过面向对象的课程吗?说一下你理解的面向对象。

五、你学过哪些数据结构,说一下数据结构的好处(STL模板库)

六、事件有哪些?请说一下。(Event)

七、你学习的是哪个版本的Lua?Lua语言的优点是什么?

八、你的聊天室项目好像可以,你粘包问题发生的原因是什么?你是怎么处理的?有没有更好的处理方法?

九、你在使用刚体组件时,有没有什么值得注意的点?或者说有趣的点。

十、你知道DC吗?讲一下DC(DrawCall)

十一、你在Unity中使用的是UGUI吗?使用过哪些?需要注意哪些点?

十二、情景题:工作日的一天下午,你的上级或者说领导来到你师兄或者说同事的旁边,探讨着工作项目相关的内容,而你正在工位上做事,你听到了他们讲话的内容,你选择怎么办?

十三、值类型和引用类型有何区别?

1、值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址。

2、值类型存取速度块,引用类型存取速度慢。

3、值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用

4、值类型继承自System.ValueType,引用类型继承自System.Object

5、栈的内存分配是自动释放;而堆在.NET中会有GC来释放。

6、值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

十四、客户端与服务器交互方式有几种?

socket 通常也称作”套接字“,实现服务器和客户端之间的物理连接,并进行数据传输,主要有UDP和TCP两个协议。Socket处于网络协议的传输层。

十五、如何在Unity3D中查看场景的顶点数和DrawCall数?如何降低DrawCall数?

在Game视图右上角点击Stats。降低Draw Call的技术是Draw Call Batching,在window->profiler下面。

十六、在编辑场景时将GameObject设置为Static有何作用?

设置游戏对象为Static时,这些部分被静态物体挡住而不可见时,将会剔除(或禁用)网格对象。因此,在你的场景中的所有不会动的物体都应该标记为Static,通常一直静止的物体,才会勾选static,静态物体在脚本加载的时候就开始渲染,不随着Update每帧更新,可以优化效率,是游戏更加流畅。

十七、有A和B两组物体,有什么办法能够保证A物体永远比B组物体先渲染?

把A组物体的渲染队列大于B物体的渲染队列通过shader里面的渲染队列来渲染。

十八、什么是DrawCall?DrawCall高了有什么影响?如何降低DrawCall?

Unity中,每次引擎准备数据并通知GPU的过程称为一次DrawCall。

DrawCall越高对显卡的消耗就越大,降低DrawCall的方法:

  • 1、Dynamic Batching
  • 2、Static Batching
  • 3、高级特性Shader降级为统一的低级特性的Shader。

 

十九、Unity引擎所支持的视频格式文件有哪些?

后缀为mov,mpg和avi的文件。

二十、Unity使用的是左手坐标系。

二十一、什么是导航网络?

一种用于实现自动寻址的网络。

二十二、当删除Unity工程Assets目录下的meta文件时会导致什么?为什么?

会导致在场景中游戏对象看不到,或者报错,材质找不到资源。多人协作时会导致资源的重复产生。因为每个资源文件都对应一个.meta文件,这个.meta文件中的guid就是唯一标识这个资源的。材质就是通过这个guid来记录自己使用了哪些资源,而且同一个资源的guid会因为不同的电脑而不同,所以当你上传了丢失了.meta文件的资源的时候,到了别人的电脑上就会重新产生guid,那个这个资源就相当于垃圾了。

二十三、频繁创建GameObject会降低程序性能,为什么?怎么解决?

频繁创建游戏对象,会增加游戏的DrawCall数,降低帧率,GPU会一直在渲染绘制。可以通过对象池莱管理对象;当需要创建一个游戏对象时,先去查找一下对象池中是否存在被正在使用的对象,如果有的话直接使用这个对象,并把它标记为正在使用,没有的话就创建一个,并把它添加到池中,然后标记为使用中。一个游戏对象试用完毕的时候,不要销毁掉,把它放在池中,标记为未使用。

二十四、解释一下Unity3D中的协程(coroutine)是什么?并举例说明

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否忙满足。

二十五、Unity3D在移动设备上的一些优化资源的方法

1、使用assetbundle,实现资源分离和共享,将内存控制到200m之内,同时也可以实现资源的在线更新。

2、顶点数对渲染无论是CPU还是GPU都是压力最大的贡献者,降低顶点数到8万以下,fps稳定到了30帧左右。

3、只使用一盏动态光,不是用阴影,不使用光照探头。

4、剪裁粒子系统

5、合并同时出现的粒子系统

6、自己实现轻量级的粒子系统

7、把不需要跟骨骼动画和动作过渡的地方全部使用animnation,控制骨骼数量在30根以下,

8、animator出视野不更新

9、animator的初始化很耗时(粒子上尽量不用animator)

10、除主角外都不要根骨骼运动apply root motion

你可能感兴趣的:(unity,游戏引擎,c#,面试)