Unity面试总结题库

1.AssetBundle.Unload使用时的注意事项?

        答:1.参数为false时,bundle内的序列化数据将被释放,但是任何从这个bundle中实例化的物体都将完好,也不能再从这个bundle中加载更多物体。2.参数为true时,所有从该bundle中加载的物体也将被销毁,如果场景中有物体引用该资源,引用会丢失。
        当使用WWW加载bundle完毕后,对其中的资源进行实例化操作的同时不要立即卸载该bundle,因为实例化的过程可能还需要渲染等操作,虽然时间很短,此时若立即进行unload可能会对将要实例化的资源造成影响,以至于没有贴图或者材质等问题。

2.常用的排序算法有哪些?简述各算法的优缺点,使用场景?

        答:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序;


        排序算法稳定性的定义:如果两个相等的a和b,排序前a在b之前,排序后a还在b之前,则称这种排序算法是稳定的。通俗讲保证排序前后两个相等的数的相对顺序不变。

       冒泡排序:从第一个元素开始,依次比较相邻两个元素并判断是否交换位置。重复步骤Length-1次。
最差时间复杂度 ---- O(n^2),稳定性 ------------ 稳定

void BubbleSort(int A[], int n)
{
    for (int j = 0; j < n - 1; j++)         // 每次最大元素就像气泡一样"浮"到数组的最后
    {
        for (int i = 0; i < n - 1 - j; i++) // 依次比较相邻的两个元素,使较大的那个向后移
        {
            if (A[i] > A[i + 1])            // 如果条件改成A[i] >= A[i + 1],则变为不稳定的排序算法
            {
                Swap(A, i, i + 1);
            }
        }
    }
}


尽管冒泡排序是最容易了解和实现的排序算法之一,但它对于少数元素之外的数列排序是很没有效率的。

        简单选择排序:先从序列中找到最大(小)元素,放到序列起始位置。再从剩下未排序元素中寻找最大(小)元素,放到已排序列的末尾。重复之,直至所有元素排序完毕。
最差时间复杂度 ---- O(n^2),稳定性 ------------ 不稳定

void SelectionSort(int A[], int n)
{
    for (int i = 0; i < n - 1; i++)         // i为已排序序列的末尾
    {
        int min = i;
        for (int j = i + 1; j < n; j++)     // 未排序序列
        {
            if (A[j] < A[min])              // 找出未排序序列中的最小值
            {
                min = j;
            }
        }
        if (min != i)
        {
            Swap(A, min, i);    // 放到已排序序列的末尾,该操作很有可能把稳定性打乱,所以选择排序是不稳定的排序算法
        }
    }
}

数据量少的时候的过程:数据量多的时候的宏观过程:

选择排序是不稳定的排序算法,不稳定发生在最小元素与A[i]交换的时刻。

比如序列:{ 5, 8, 5, 2, 9 },一次选择的最小元素是2,然后把2和第一个5进行交换,从而改变了两个元素5的相对次序。

        直接插入排序:从第一个元素开始,认定已经被排序。取出下一个元素,在已排序的序列中从后向前扫描。若该元素大于新元素,将该元素移到下一位置。重复上一步骤,直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到该位置后。重复之前的步骤。

最差时间复杂度 ---- O(n^2),稳定性 ------------ 不稳定

void InsertionSort(int A[], int n)
{
    for (int i = 1; i < n; i++)         // 类似抓扑克牌排序
    {
        int get = A[i];                 // 右手抓到一张扑克牌
        int j = i - 1;                  // 拿在左手上的牌总是排序好的
        while (j >= 0 && A[j] > get)    // 将抓到的牌与手牌从右向左进行比较
        {
            A[j + 1] = A[j];            // 如果该手牌比抓到的牌大,就将其右移
            j--;
        }
        A[j + 1] = get; // 直到该手牌比抓到的牌小(或二者相等),将抓到的牌插入到该手牌右边(相等元素的相对次序未变,所以插入排序是稳定的)
    }
}

数据量少的时候的过程:多的时候:

        插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,比如量级小于千,那么插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)。

        希尔排序:希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
2.插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

  希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)
最差时间复杂度 ---- 根据步长序列的不同而不同。已知最好的为O(n(logn)^2),稳定性 ------------ 不稳定

void ShellSort(int A[], int n)
{
    int h = 0;
    while (h <= n)                          // 生成初始增量
    {
        h = 3 * h + 1;
    }
    while (h >= 1)
    {
        for (int i = h; i < n; i++)
        {
            int j = i - h;
            int get = A[i];
            while (j >= 0 && A[j] > get)
            {
                A[j + h] = A[j];
                j = j - h;
            }
            A[j + h] = get;
        }
        h = (h - 1) / 3;                    // 递减增量
    }
}

以23, 10, 4, 1的步长序列进行希尔排序:

        其他排序详细见:https://www.cnblogs.com/eniac12/p/5329396.html

3.ArrayList与List的区别?Dictionary与List的区别(效率,特点,使用场合)?

        答:集合ArrayList插入不同类型的数据后(ArrayList将数据当作object存储),在进行数据处理时容易出现类型不匹配的错误,使用时需要进行类型转换处理,存在装箱与拆箱操作,造成性能大量损耗的现象。泛型List与集合ArrayList类似且继承IList接口,在声明List集合时也要声明集合内部数据的对象类型,避免了装箱和拆箱的问题。Dictionary在初始化的时候也必须指定其类型,而且他还需要指定一个Key,并且这个Key是唯一的。正因为这样,Dictionary的索引速度非常快。但是也因为他增加了一个Key,Dictionary占用的内存空间比其他类型要大。他是通过Key来查找元素的,元素的顺序是不定的。

        对于经常遍历的列表尽量用List,对于经常查找的列表尽量用Dictionary;

4.SetParent为什么很费?

        答:内存泄漏。

5.Unity中怎么使用C#代码调用C++?

     答:各种调用C++的方法在各种平台下的总结如下(可能会有出入):

1、在VS中使用CLR C++工程,编译产生.dll,放入Plugins
✔ Android、Editor、Windows、OSX 

✘ IOS (报的错貌似与il2cpp有关)

2、直接在Plugins中放入.cpp文件(不支持子目录)

✔ IOS 
✘ Editor、Windows、OSX、Android

3、编译出目标移动平台的库(.a或.so等),放入Plugins
✔ IOS、Android 
✘ Editor、Windows、OSX

4、编译出PC平台的库,放入Plugins
✔ Windows(.dll)、Linux(.so)、OSX(Bundle) 
✘ iOS、Android 

? Editor

详细见:http://blog.csdn.net/IceTeaSet/article/details/53142929  http://blog.csdn.net/woainishifu/article/details/54017550

6.lua中loadfile,dofile,require的作用与区别?

        答:1.loadfile——只编译,不运行
loadfile故名思议,它只会加载文件,编译代码,不会运行文件里的代码。
2.dofile——执行,每一次都会重新编译并执行
很明显,dofile就是会执行代码。
3.require——只执行一次
require和dofile有点像,不过又很不一样,require在第一次加载文件的时候,会执行里面的代码。

但是,第二次之后,再次加载文件,则不会重复执行了。换句话说,它会保存已经加载过的文件,不会重复加载。

详细测试见:http://blog.csdn.net/yinhe888675/article/details/51034707

7.Lua中函数定义与调用时的点号(.)与冒号(:)的作用与区别?

        答:冒号的作用就是:定义函数时,给函数的添加隐藏的第一个参数self;调用函数时,默认把当前调用者作为第一个参数传递进去。点号则没有此功能。换句话说,冒号就是一种简化版的函数定义与调用。

8.矩阵,四元数,欧拉角来表达3D旋转的区别,何为万向节死锁?

 欧拉角:优点》就是直观,容易理解。缺点 》欧拉角是不可传递的,旋转的顺序影响旋转的结果,不同的应用又可能使用不同的旋转顺序,旋转顺序无法统一;3个旋转的角度可以不受限制,即可以是10000度,也可以是-1500度; 可能造成万向节死锁(Gimbal Lock)。
矩阵:优点》支持传递性,使用起来很简单方便。缺点》 浪费内存,至少需要12个参数,来表示一个6个自由度的结构;可能就引入不该有的缩放(Scaling)和错切(Sheering); 矩阵插值的实现难度很大;不直观。

四元数:缺点》很不直观,理解起来较费劲。优点:更健壮,不会出现欧拉角中出现的万向节死锁。更高效,花费更少的空间和时间;当使用有限的精度对矩阵进行大量的操作,就会发生漂移(Drift),实数的四舍五入就会不断累积到矩阵中。由于漂移的存在,旋转的操作就可能发生错误,所以要对矩阵进行归一化操作,重置矩阵,这是很费时的操作。四元数只有4个值,而矩阵有9个,它经历的漂移作用就小,而且归一化时间就更少。

         欧拉角旋转使用的是物体的局部坐标系,旋转过程是对局部坐标的三个轴X,Y,Z分别进行的旋转。当旋转X轴至90度的时候,会发现再旋转Y轴和Z轴效果是一样的。这便是万向节死锁。 

9.浅谈通常Shader中是如何将图片变成灰度图?

float _FadeLevel;

fixed4 frag (v2f i) : COLOR
{
	fixed4 col = tex2D(_MainTex, i.uv);
    if (col.a == 0.0)
    {
        discard;
    } 
    float c = (col.r + col.g + col.b) / 3.0f;
    col.r = col.r * _FadeLevel + c*(1 - _FadeLevel);
    col.g = col.g * _FadeLevel + c*(1 - _FadeLevel);
    col.b = col.b * _FadeLevel + c*(1 - _FadeLevel); 

	return col;
}

10.Unity UI与3D模型组合显示?

        答:借助RenderTexture,单独启用一个相机照射3D模型对RenderTexture进行数据填充,然后,在UI上使用Raw Image控件读取RenderTexture来显示。

11.Unity影响渲染顺序的因素总结

        答: 能够影响渲染顺序的因素有:
1、Camera Depth
相机组件上设置的相机深度,深度越大越靠后渲染。
2、Sorting Layer
在Tags & Layers设置中可见


3、Order In Layer
相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效。
4、RenderQueue

Shader中对Tags设置的“Queue”。

12.简述常用的设计模式?

13.简述渲染管线流程?

14.常用效果的shader实现?

15.简述图片压缩策略?

16.排序算法的过程描述?

你可能感兴趣的:(Unity,代码笔记)