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.排序算法的過程描述?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章