Unity 试题

来源:互联网 发布:aso优化app平台 编辑:程序博客网 时间:2024/06/05 16:41
  • TCP/IP协议栈各个层次及分别的功能是什么?
    答:网络接口层:这是协议栈的最低层,对应OSI的物理层和数据链路层,主要完成数据帧的实际发送和接收。
      网络层:处理分组在网络中的活动,例如路由选择和转发等,这一层主要包括IP协议、ARP、ICMP协议等。
      传输层:主要功能是提供应用程序之间的通信,这一层主要是TCP/UDP协议。
      应用层:用来处理特定的应用,针对不同的应用提供不同的协议,例如进行文件传输时用到的FTP协议,发送email用到的SMTP等。


    Unity提供了几种光源,分别是什么?
    答:四种,平行光—Directional Light,点光源—Point Light,聚光灯—Spot Light,区域光源—Area Light。


    简述一下对象池,你觉得在FPS里哪些东西适合使用对象池?
    答:对象池就存放需要被反复调用资源的一个空间,比如游戏中要常被大量复制的对象,子弹,敌人,以及任何重复出现的对象。


    CharacterController和Rigidbody的区别
    Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的的Rigidbody,具有一定的物理效果但不是完全真实的。


    移动相机动作在哪个函数里,为什么在这个函数里?
    答:LateUpdate,是在所有的Update结束后才调用,比较适合用于命令脚本的执行。很多的案例是摄像机的跟随,而且需要等所有的Update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。


    请简述prefab的用处
    答:在游戏运行时实例化,prefab相当于一个模板,对你已经有的素材、脚本、参数做一个默认的配置,以便于以后的修改,同时prefab打包的内容简化了导出的操作,便于团队的交流。


    请简述sealed关键字用在类声明时与函数声明时的作用
    答:sealed关键字用在类声明时可防止其他类继承此类,用在方法中声明则可防止派生类重写此方法。


    请简述private,public,protected,internal的区别
    • private:仅对该类公开
    • public:对任何类和成员都公开,无限制访问
    • protected:对该类和其派生类公开
    • internal:只能在包含该类的程序集中访问该类


    GPU的工作原理
    简而言之,GPU的图形(处理)流水线完成如下的工作(并不一定是按照如下顺序):
    • 顶点处理:这阶段GPU读取描述3D图形外观的顶点数据并根据顶点数据确定3D图形的形状及位置关系,建立起3D图形的骨架。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Vertex Shader(定点着色器)完成。
    • 光栅化计算:显示器实际显示的图像是由像素组成的,我们需要将上面生成的图形上的点和线通过一定的算法转换到相应的像素点。把一个矢量图形转换为一系列像素点的过程就称为光栅化。例如,一条数学表示的斜线段,最终被转化成阶梯状的连续像素点。
    • 纹理帖图:顶点单元生成的多边形只构成了3D物体的轮廓,而纹理映射(texture mapping)工作完成对多边形表面的帖图,通俗的说就是将多边形的表面贴上相应的图片,从而生成“真实”的图形。TMU(Texture mapping unit)即是用来完成此项工作的。
    • 像素处理:这阶段(在对每个像素进行光栅化处理期间)GPU完成对像素的计算和处理,从而确定每个像素的最终属性。在支持DX8和DX9规格的GPU中,这些工作由硬件实现的Pixel Shader(像素着色器)完成。
    • 最终输出:由ROP(光栅化引擎)最终完成像素的输出,1帧渲染完毕后,被送到显存帧缓冲区。
    • 总结:GPU的工作通俗来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并输出。


    什么是渲染管道?
    答:是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。
    主要步骤有:
      本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。


    如何优化内存?
    答:优化内存的方法有很多种,例如
      1.压缩自带类库;
      2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
      3.释放AssetBundle占用的资源;
      4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
      5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。


    物体发生碰撞的整个过程中有几个阶段,分别列出对应函数。
    答:有三个阶段,其对应的函数是OnCollisionEnter、OnCollisionStay、OnCollisionExit。


    什么叫链条关节?
    答:Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。


    物体自身旋转使用的函数?
    答: Transform.Rotate()


    Unity3d 脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
    答:Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>Reset——>OnDisable——>OnDestroy


    物理更新一般放在哪个系统函数里?
    答:FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。
      FixedUpdate比较适用于物理引擎的计算,因为跟每帧渲染有关。
      Update就比较适合做控制。


    在场景中放置多个Camera并同时处于活动状态会发生什么?
    答:游戏界面可以看到很多摄像机的混合。


    如何销毁一个UnityEngine.Object及其子类?
    答: 使用Destroy()方法;


    请描述游戏动画有哪几种,以及其原理?
    答:主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。
    关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活,Quake2中使用这种动画;
    骨骼动画:广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;
    单一网格模型动画:由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。


    为什么Unity3d中会发生在组件上出现数据丢失的情况
    答: 一般是组件上绑定的物体对象被删除了。


    alpha blend工作原理
    答:Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。


    写出光照计算中的diffuse的计算公式
    答:diffuse = Kd x colorLight x max(N*L,0);Kd 漫反射系数、colorLight 光的颜色、N 单位法线向量、L 由点指向光源的单位向量、其中N与L点乘,如果结果小于等于0,则漫反射为0。


    LOD是什么,优缺点是什么?
    答:LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。


    两种阴影判断的方法及工作原理。
    答:本影和半影。
    本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)。
    半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)
    工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)。


    Vertex Shader是什么,怎么计算?
    答:顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。
      Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。


    请描述Interface与抽象类之间的不同
    答:抽象类表示该类中可能已经有一些方法的具体定义,但接口只能定义各个方法的界面 ,不能具体的实现代码在成员方法中。
      类是子类用来继承的,当父类已有实际功能的方法时该方法在子类中可不必实现,直接引用父类的方法,子类也可重写该父类的方法。
      实现接口时必须要实现接口中所有的方法,不能遗漏任何一个。


    Net与Mono有什么关系?
    答:Mono是.Net的一个开源跨平台工具,就类似Java虚拟机。Java本身不是跨平台语言,但运行在虚拟机上就能够实现了跨平台。.Net只能在Windows下运行,而Mono可以实现跨平台编译运行,可运行于Linux,Unix,Mac OS等。


    简述Unity3D支持的作为脚本的语言名称
    答:Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
      Unity里的脚本都会经过编译,他们的运行速度也很快。JavaScript、 C#、Boo这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。


    Unity3D是否支持写成多线程程序?若支持需要注意什么?
    答:仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用。
    支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine。
    注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象。


    Unity3D的协程和C#线程之间的区别是什么?
    答:多线程程序同时运行多个线程 ,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。
      除主线程之外的线程无法访问Unity3D的对象、组件、方法。
      Unity3d没有多线程的概念,不过Unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。
      StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。