欢迎光临散文网 会员登陆 & 注册

Unity面试题以及算法数据结构(2020)

2020-10-14 14:35 作者:今日份的好心情呀  | 我要投稿


1.请简述值类型和引用类型的区别?

         值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。
         引用类型包括:数组,用户定义的类、接口、委托,object,字符串,null类型,类。

2.C#中所有引用的基类是什么?

        所有引用的基类是Object,包名是System

3.请简述ArrayList和List<Int>它们有什么区别?

      ArrayList 是一个数组,继承实现了List基类,是比较传统使用的程序数组变量,存在拆箱装箱操作,比较耗时。
          List<int>是调用List<T>,用了C#的泛型特性

4.简述四元数的作用,四元数对欧拉角的优点?

       四元素用于表示旋转

         1)增量旋转
         2)避免万向锁
         3)给定方位的表达式有2种,互为正负(欧拉角有多种

5.position和LocalPosition的区别?

         1)position是根据世界原点为中心点

          2)localPosition是根据父节点为中心点,如果 没有父节点。localPosition和position没有区别

          3)选中一个物体左上角Global和Local切换看物体世界坐标轴和本地坐标轴

          4)transform组件下的Position属性是一个先对于父对象的局部坐标,当然,如果没有父对象,其属性框里显示的自然也是世界坐标了。如果有父对象,那么在unity编辑器显示的值是这个transform以上一级父对象为基准的坐标。

6.RebderTexture是什么,他有什么作用?

        是一种特殊的Textrue的类型,渲染纹理(镜头的模糊效果,后视镜)

7.谈谈你所知道的Unity内存优化方法?

      方法有很多种:

                       压缩自带类库

                       将暂时不用的以后还需要的物体隐藏起来而不是直接Destroy掉(对象池)

                       释放AssetBundle占用的资源

                       降低模型的片面数,降低模型的骨骼数量,降低贴图的大小

                       使用光照贴图,使用多层细节(LOD),使用着色器(shader),使用预设(Prafab)

                       代码中少产生临时变量

8.什么是DrawCall?如何降低DrawCall?

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

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

           Dynamic Batching

           static Batching  静态批处理

           高级特性Shader降低为统一的低级特性的Shader

            具体详细内容可以看大佬总结:https://blog.csdn.net/yupu56/article/details/50177935?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242

9.如何安全的在不同工程间安全的迁移Asset数据?

       三种方法:

                   将Assets目录和Library目录一起迁移

                    导出包 exprot Package

                     用unity自带的assets Server功能

10.向量的点乘,叉乘以及归一化的意义是什么?

        点乘描述了两个向量的相似程度,结果越大两个向量越相似,可表示投影

            叉乘得到的向量垂直于原来的两个向量

            标准化向量用在关系的方向,不关心大小的时候

11.不同的手机设备尺寸分辨率都不一样,该如何进行适配

        NGUI很好的解决了这一点,屏幕分辨率的自适应,原理就是计算出屏幕的宽高比

            跟原来的预设的屏幕分辨率求出一个对比值,然后修改相机的size

            UGUI通过锚点和中心点和分辨率也可以解决这个问题

12.unity中的碰撞器和触发器的区别?

        一个有碰撞效果(碰撞器),一个没有碰撞效果(触发器)

13.动态加载资源的方式有哪些?

            Resources和AssetBundle的方式加载资源

14.请简述一个对象池,你觉得在FPS里哪些东西适合使用对象池?

        对象池就是存放需要被反复调用资源的一个空间,当一个对象会大量生成的时候,

如果每次都销毁创建会很浪费时间,通过对象池把暂时不用的对象放到一个池子中

(也就是一个集合),当下次要重新生成这个对象的时候先去池子中查找一下是否

有可用的对象,如果有的话就直接拿出来使用,不需要再创建,如果池子中没有可

用的对象,才会需要重新创建,利用空间换时间来达到游戏的高速运行的效果,

在FPS游戏中要常被大量复制的对象包括,子弹,敌人,粒子 等

15.请简述private,public,protected,internal的区别?

        public:对任何类和成员都公开,无限制访问

            private:仅对该类公开

            protected:保护修饰符,对该类和其派生类公开

            internal:只能在包含该类的程序集中访问

16.Unity3D脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法?

        Awake——>OnEnable——>Start——>Update——>FixedUpdate——>

LateUpdate——>OnGUI——>OnDisable——>OnDestroy

17.物理更新一般放在哪一个系统函数里?

        FixedUpdate没固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较使用于物理引擎计算,因为是跟每帧渲染有关。Update就比较适合做控制。

18.在场景中放置多个Camera并同时处于活动状态会发生什么?

        游戏界面可以看到很多相机的混合

19.Readonly和Const的区别是什么?请简单描述

        readonly只读字段可以不设置初始值,而const常量就不行必须在创建时设置初始值

            readonly可以在构造方法中进行赋值,而const常量就不可以

20.C#中的排序方式有哪些?

        冒泡排序,选择排序,插入排序,快速排序,希尔排序,归并排序

21.C#中反射的实现原理?

        审查元数据并收集关于它的类型信息的能力。实现原理:在运行时根据程序集及其中的类型得到元数据

22.C#中四种访问修饰符是哪些?各有什么区别?

属性修饰符:

        Serializable:按值将对象封送到远程服务器。

        STATread:是单线程套间的意思,是一种线程模型。

        MATAThread:是多线程套间的意思,也是一种线程模型。

存取修饰符:

        public:存取不受限制。

        private:只有包含该成员的类可以存取。

        internal:只有当前工程可以存取。

        protected:只有包含该成员的类以及派生类可以存取。

类修饰符:

        abstract:抽象类。指示一个类只能作为其它类的基类。

        sealed:密封类。指示一个类不能被继承。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。

成员修饰符:

        abstract:指示该方法或属性没有实现。

        sealed:密封方法。可以防止在派生类中对该方法的override(重载)。不是类的每个成员方法都可以作为密封方法密封方法,必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用。

        delegate:委托。用来定义一个函数指针。C#中的事件驱动是基于delegate + event的。

        const:指定该成员的值只读不允许修改。

        event:声明一个事件。

        extern:指示方法在外部实现。

        override:重写。对由基类继承成员的新实现。    

        readonly:指示一个域只能在声明时以及相同类的内部被赋值。

        static:指示一个成员属于类型本身,而不是属于特定的对象。即在定义后可不经实例化,就可使用。

        virtual:指示一个方法或存取器的实现可以在继承类中被覆盖。

        new:在派生类中隐藏指定的基类成员,从而实现重写的功能。 若要隐藏继承类的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。

23.Heap与Stack有何区别?

         heap是堆,stack是栈。

        stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。

        stack空间有限,heap的空间是很大的自由区。

24.值类型和引用类型有何区别?

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

        2)值类型存取速度快,引用类型存取速度慢。

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

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

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

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







Unity面试题以及算法数据结构(2020)的评论 (共 条)

分享到微博请遵守国家法律