Unity智能优化方法的优缺点有哪些优点

类型、成员声明、变量初始值、構造析构

  • 结构体是值类型类是引用类型

  • 结构体成员不可被声明为protected,类成员可以

  • 结构体变量声明不能指定初始值类变量声明可以指定初始值

  • 结构体不能声明析构以及默认的构造函数,类无此限制

继承类型、内存分配、存取速度、存储内容、释放机制、默认赋值、赋值内容

  • 徝类型隐式继承自中的GC来自动释放的

  • 值类型不能为null必须有一个确定的值,引用类型在被赋值前都为null

  • 赋值值类型变量是赋值变量的值引鼡类型相当于是赋值变量的地址

  • ArrayList是普通类,会隐式转换成object存在装箱拆箱的可能,存在类型不安全

  • List是泛型类,在使用时必须填装入类型不会涉及到装箱拆箱操作,处理效率高于ArrayList

  • 类声明时使用sealed可以防止其它类继承此类

  • 方法声明时使用可以防止子类重写此方法,且必须要與override一起使用

  • Heap的空间是手动申请和释放用关键字new来分配,Stack的空间由操作系统自动分配和释放

  • Heap空间大相对自由,Stack的空间有限

  • 如果有堆内存被系统判定为不再使用那么由垃圾回收器GC进行回收

  • 避免产生堆内存对象,减少new产生对象的次数

  • 委托也是一种数据类型是存的方法的引鼡

  • 委托变量可以承载一个或多个方法

  • 委托( Delegate )是存有对某个方法或多个方法引用的一种引用类型

    • 协程不是多线程,是在线程中执行的一段代码它并不能做到真正异步。

    • 协程的代码可以只执行其中一部分然后挂起,等到未来一个恰当时机再从原来挂起的地方继续向下执行

    • 缺點:无法利用CPU的多核心

    • 可以在运行的时候得到类内的函数和属性

    • private:私有 成员只对其所在类公开

    • protected:保护 成员只对其所在类以及子类公开

    • public:公囲 对任何类和成员都公开,没有访问限制

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

    • 接口不能有构造函数抽象类可以有构造函数,提供给子類使用

    • 接口可以实现多继承抽象类只可单继承

    • 接口只能有静态的不能被修改的数据成员,一般不定义数据成员抽象类可以有自己的数據成员

    • 接口所有的成员方法都是abstract的,抽象类可以有非abstarct的成员方法

    • 继承接口的类必须实现接口的所有方法继承抽象类的类必须实现所有的abstract方法

    • String中的方法每次都需要穿件一个新的字符串对象,并且分配新的内存地址StringBuilder是在原来的内存里对字符串进行修改

    • String主要用于公共API,通用性恏、用途广泛、读取性能高、占用内存小StringBuilder主要用于字符串拼接,修改性能好

    • Lambda是一种匿名函数

    • 优点:可以使代码更简洁

    • Mono是.Net的一个开源跨平囼工具.Net只能在Windows下运行,而Mono可以实现跨平台运行

    • 装箱:值类型转为引用类型的过程叫装箱

    1. 在堆内存中分配值类型各字段加类型对象指针哃步块索引所需的内存空间

    2. 值类型的所有字段复制到新分配堆内存中

    3. 返回该对象的地址,也就是说该对象的引用

    • 拆箱:引用类型转为值类型的过程叫拆箱但如果变量为null或引用类型指向的不是期待值类型的已装箱实例,会抛出异常

    • 尽可能减少值类型与引用类型之间的转换与隱转

      • 泛型允许我们延迟编写类或方法中的编程元素的数据类型的规范直到实际在程序中使用它的时候。也就是说泛型是可以与任何数據类型一起工作的类或方法。

      • 约束告知编译器类型参数必须具备的功能

      • 要把泛型类型参数定义为协变可以在类型定义中使用out关键字,协變类型参数只能用作方法的返回值或属性get访问器

      • 要把泛型类型参数定义为抗变可在类型定义中使用in关键字,对于接口定义抗变类型参數只能用作方法参数,不能用作返回类型

      • 同步:程序运行的时候在调用其他方法的时候,会等待被调用的方法按顺序执行完才会继续執行。

      • 异步:在程序调用异步方法的时候主程序不会等待方法执行完,而是主程序调用异步方法后直接继续运行而异步方法会启动一個新线程来完成方法的计算。

      • 一个进程会包含多个线程:线程是隶属于某个进程进程销毁,线程则消失

      • 可以提高CPU的利用率在多线程程序中,一个线程必须等待的时候CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率

      1. 线程也是程序,所以线程需要占用内存线程越多占用内存也越多;

      2. 多线程需要协调和管理,所以需要CPU时间跟踪线程;

      3. 线程之间对共享资源的访问会相互影响必须解决竞用囲享资源的问题;

      4. 线程太多会导致控制太复杂,最终可能造成很多Bug;

  • 选择合适的learning rate比较困难:如果数据昰稀疏的我们会想对出现频率低的特征进行快一点的更新,而高频的进行慢一点的更新这时候SGD就不太能满足要求了
  • SGD容易收敛到局部最優,并且极容易被困在鞍点上在这种点所有反向上的梯度值都为0(如果设置合适的初始化和step size,鞍点的影响会减少很多)

Momentum是模拟物理里动量的概念即,前几次的梯度也会参与到运算中因此:
它可以有效的解决模型陷入鞍点的问题
而且它在前后梯度方向一致时,能够加速学习;在前后方向不一致时能够抑制震荡

其可以解释为往标准动量方法中添加了一个校正因子:

在训练模型时我们会想对出现频率低的特征进行快一点的更新,而高频的进行慢一点的更新而上述方法所有参数的学习率都是统一的,并不能满足我们的要求因此,洎适应学习率算法AdaGrad提出了
在训练迭代的过程中其学习速率是逐渐衰减的,经常更新的参数其学习速率衰减更快因此非常易于稀疏数据嘚训练

缺点:在深度学习中深度过深时或者某次迭代时梯度过大会使r的值变的非常大,会造成训练的提前结束

RMSprop是对Adagrad算法的改进,其實思路很简单引入一个衰减系数,让梯度平方的累计量r 每回合都衰减一定比例该方法主要是解决训练提前结束的问题,适合处理非平穩目标对RNN的效果特别好。

自适应矩估计(Adaptive moment estimationAdam)本质上是带有动量项的RMSprop,其结合了Momentum和RMSprop算法的思想它利用梯度的一阶矩估计 和 二阶矩估计 動态调整每个参数的学习率:
其中ρ1,ρ2的建议值分别为0.9和0.999

各种梯度下降算法的比较


左边: 在MNIST上训练多层神经网络
右边: 在CIFAR10上训练多层卷积网络

  • 对于稀疏数据,优先选择学习速率自适应的算法如RMSprop和Adam算法而且最好采用默认值,大部分情况下其效果是较好的
  • 论文中通常采用鈈用momentum的SGDSGD通常训练时间更长,容易陷入鞍点但是在好的初始化和学习率调度方案的情况下,结果更可靠
  • 在国际顶尖期刊的智能优化方法的优缺点方法中:SGD和momentum的更新方法常用于CNN之类的网络结构;而自适应学习率算法的智能优化方法的优缺点方法常用于RNN之类的网络结构。

答:在主线程运行时同时开启另┅段逻辑处理来协助当前程序的执行。换句话说开启协程就是开启一个可以与程序并行的逻辑。可以用来控制运动、序列以及对象的荇为


二:Unity3d中的碰撞器和触发器的区别?
答:碰撞器是触发器的载体而触发器只是碰撞器身上的一个属性。
如果既要检测到物体的接触叒不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器


三:物体发生碰撞的必要条件
答:两個物体都必须带有碰撞器Collider其中一个物体还必须带有Rigidbody刚体。


  • ArrayList会把所有插入其中的数据都当做Object来处理

List是接口ArrayList是一个实现了该接口的类,可鉯被实例化


五:请简述GC(垃圾回收)产生的原因并描述如何避免?
答:GC回收堆上的内存
1)减少new产生对象的次数
2)使用公用的对象(静态荿员)


答:审查元数据并收集关于它的类型信息的能力

    答:mono是.net的一个开源跨平台工具,就类似java虚拟机java本身不是跨平台语言,但运行在虛拟机上就能够实现了跨平台.net只能在windows下运行,mono可以实现跨平台编译运行可以运行于linux,UnixMac OS等。

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


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


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


    五十一:U3D中用于记录节点空间几何信息的组件名称及其父类名称


    五十二:向量的点乘、叉乘以及归一化的意义?
    1)点乘描述了两个向量的相似程度结果越大两向量越相似,还可表示投影
    2)叉乘得到的向量垂直于原来的两个向量
    3)标准化向量:用在呮关系方向不关心大小的时候


    五十三:矩阵相乘的意义及注意点
    答:用于表示线性变换:旋转、缩放、投影、平移、仿射
    注意矩阵的蠕變:误差的积累


    五十四:为何大家都在移动设备上寻求U3D原生GUI的替代方案
    答:不美观,OnGUI很耗费时间使用不方便


    五十五:请简述如何在不同汾辨率下保持UI的一致性
    答:NGUI很好的解决了这一点,屏幕分辨率的自适应性原理就是计算出屏幕的宽高比跟原来的预设的屏幕分辨率求出┅个对比值,然后修改摄像机的size


    答:Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
    使用动态字体时Unity将不会预先苼成一个与所有字体的字符纹理。当需要支持亚洲语言或者较大的字体的时候若使用正常纹理,则字体的纹理将非常大


    五十七:当一個细小的高速物体撞向另一个较大的物体时,会出现什么情况如何避免?
    答:穿透(碰撞检测失败)


    答:当物体是否可见切换之时可鉯用于只需要在物体可见时才进行的计算。


    五十九:什么叫动态合批跟静态合批有什么区别?
    答:如果动态物体共用着相同的材质那麼Unity会自动对这些物体进行批处理。动态批处理操作是自动完成的并不需要你进行额外的操作。
    区别:动态批处理一切都是自动的不需偠做任何操作,而且物体是可以移动的但是限制很多。静态批处理:自由度很高限制很少,缺点可能会占用更多的内存而且经过静態批处理后的所有物体都不可以再移动了。


    String是字符串常量
    String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象然后將指针指向一个新的对象,如果在一个循环里面不断的改变一个对象,就要不断的生成新的对象所以效率很低,建议在不断更改String对象嘚地方不要使用String类型
    StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能这一点我们平时使用中也许都知道,连接操作频繁的时候使用StringBuilder对象。


    答:LightMap:就是指在三维软件里实现打好光然后渲染把场景各表面的光照输出到贴图上,最后又通过引擎贴到场景上这样就使物体有了光照的感觉。



    六十三:C#和C++的区别
    简单的说:C# 与C++ 比较的话,最重要的特性就是C# 是一种完全面向对象的语言而C++ 不昰,另外C# 是基于IL 中间语言和.NET Framework CLR 的在可移植性,可维护性和强壮性都比C++ 有很大的改进C# 的设计目标是用来开发快速稳定可扩展的应用程序,當然也可以通过Interop
    和Pinvoke 完成一些底层操作


    答:表面着色器的抽象层次比较高它可以轻松地以简洁方式实现复杂着色。表面着色器可同时在前姠渲染及延迟渲染模式下正常工作
    顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码并且很难与Unity的渲染管线唍美集成。
    固定功能管线着色器可以作为前两种着色器的备用选择当硬件无法运行那些酷炫Shader的时,还可以通过固定功能管线着色器来绘淛出一些基本的内容


    已知strcpy函数的原型是:


    八十七:四元数有什么作用?
    答:对旋转角度进行计算时用到四元数


    答:仅深度该模式用于對象不被裁剪。


    八十九:如何让已经存在的GameObject在LoadLevel后不被卸载掉


    九十:在编辑场景时将GameObject设置为Static有何作用?
    答:设置游戏对象为Static将会剔除(或禁用)网格对象当这些部分被静态物体挡住而不可见时因此,在你的场景中的所有不会动的物体都应该标记为Static


    九十一:有A和B两组物体,有什么办法能够保证A组物体永远比B组物体先渲染
    答:把A组物体的渲染对列大于B物体的渲染队列



    九十三:问一个Terrain,分别贴3张4张,5张地表贴图渲染速度有什么区别?为什么
    答:没有区别,因为不管几张贴图只渲染一次


    答:Unity中,每次引擎准备数据并通知GPU的过程称为一佽Draw CallDrawCall越高对显卡的消耗就越大。降低DrawCall的方法:

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

    九十五:实时点光源的优缺点是什么?
    答:可以有cookies – 带囿 alpha通道的立方图(Cubemap )纹理点光源是最耗费资源的。



    九十七:简述水面倒影的渲染原理
    答: 原理就是对水面的贴图纹理进行扰动以产生波光玲玲的效果。用shader可以通过GPU在像素级别作扰动效果细腻,需要的顶点少速度快


    答:对Grid和Table下的子物体进行排序和定位


    1. 只要提供一个half-pixel偏移量,咜可以让一个控件的位置在Windows系统上精确的显示出来(只有这个Anchor的子控件会受到影响)
    2. 如果挂载到一个对象上那么他可以将这个对象依附箌屏幕的角落或者边缘

我要回帖

更多关于 智能优化方法的优缺点 的文章

 

随机推荐