1. 程式人生 > >Unity3D面試基礎題總結

Unity3D面試基礎題總結

1.Draw Call本身的含義就是CPU呼叫影象程式設計介面,像OpenGL或者 DirectX。簡單來說,Draw Call就是由CPU發起的一個命令,新增到一個命令緩衝區,當GPU完成了上一次的渲染任務之後,會從命令緩衝區的命令佇列中再取出一個並執行。CPU每次呼叫Draw Call之前需要向GPU傳送很多內容,包括狀態,資料,命令等等。而GPU的渲染能力是很強的,渲染200個網格和2000個網格沒什麼區別。所以當CPU呼叫的Draw Call過多時,會造成比較大的效能消耗,命令緩衝區中的命令已經被GPU執行完了,CPU還在準備下一個Draw Call,而GPU處於等待狀態,就影響了效率了。

2.渲染流水線

中的3個概念階段:

(1).應用階段(由開發者設定每個模型的渲染狀態,材質,紋理,shader等,輸出渲染圖元)

(2).幾何階段(繪製圖元,如何繪製,在哪裡繪製,輸出螢幕空間的頂點資訊)

(3).光柵化階段(根據上個階段傳遞的資料產生螢幕上的畫素,並渲染出最終影象)

3.單例模式:確保一個類只有一個例項,在系統中把這個例項當作一個工具來使用,當需要頻繁建立銷燬某個物件時,單例模式能提高效能

缺點:(1).不能繼承(登記式模式可以被繼承),難以拓展。(2).濫用單例模式會提高程式碼之間的耦合度。

觀察者模式是為了定義物件間的一種一對多的依賴關係,以便於當一個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。是一種鬆耦合的設計模式。

4. 引用型別繼承自Systerm.Object類,值型別則是繼承Systerm.Object的子類Systerm.ValueType類。

值型別的資料儲存在記憶體的棧中;引用型別的資料儲存在記憶體的堆(new 出來的物件)中,在棧中存放資料引用或地址

值型別存取速度快,引用型別存取速度慢

值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用

5. 指標其實是一個整型的變數,用來儲存其它變數的地址,地址表示資料在記憶體中的位置

6.string是String類的別名,字串的本質是一個char陣列,對string物件進行修改時,其實要重新分配記憶體,建立一個新的string物件,所以當需要頻繁修改string的值的時候,會使GC頻繁的去回收記憶體,效能消耗比較大;StringBuilder

例項化時可以指定一個容納量,當修改的值沒有超過容納量的時候不會重新分配記憶體

7.裝箱是指將值型別轉換為引用型別的過程,首先從託管堆中為新生成的引用物件分配記憶體,然後將值型別的資料拷貝到剛剛分配的記憶體中,返回託管堆中新分配物件的地址。拆箱是指引用型別轉換為值型別的過程,首先獲取託管堆中屬於值型別那部分欄位的地址,這一步是嚴格意義上的拆箱,然後將引用物件中的值拷貝到位於執行緒堆疊上的值型別例項中。

8.序列化是指物件的狀態資訊轉換為可以儲存或傳輸的形式的過程。序列化方式一般有兩種,二進位制和XML。

9.委託上註冊了多個函式後,如果委託和事件有返回值,那麼呼叫委託和事件時,返回的將是最後一個註冊函式的返回值 . ActionFunc的本質是委託,系統內部定義的,前者為Void型別不具有返回值,後者具有返回值。(當指令碼銷燬時一定要釋放方法)

10.事件物件的呼叫只能在宣告事件的類的內部呼叫(安全),在類的外部只能對事件進行” +=”或者” -=”操作,相當於被限制了許可權的委託。

11.二分查詢

public static int binSearch(int[] array,int start,int end,int key)
{
            int mid = (end - start) / 2 + start;
            if (array[mid] == key) return key;
            if (start >= end) return -1;
            else if (key > array[mid]) return binSearch(array, mid+1, end, key);
            else if (key < array[mid]) return binSearch(array, start, mid-1, key);
            return -1;
}

12.快速排序

public static void QuickSort(int[] array, int start, int end)
        {
            if (start > end) return;    
            int index = Partition(array, start, end);
            QuickSort(array, start, index - 1);
            QuickSort(array, index + 1, end);
        }

        private static int Partition(int[] array, int start, int end)
        {
            int pivot = array[start];
            while (start < end)
            {
                while (start < end && array[end] >= pivot) end--;
                array[start] = array[end];
                while (start < end && array[start] <= pivot) start++;
                array[end] = array[start];
            }
            array[start] = pivot;
            return start;
        }

13.反射可以通過程式集,型別,型別例項獲取該程式集內所有型別+屬性+屬性型別,方法,方法的訪問型別,引數和返回值等等

14.Var用於在宣告變數時,無法確定資料型別時使用。

(1).必須在定義時初始化

(2).一但初始化完成,就不能再給變數賦與初始化值型別不同的值

(3). 必須是區域性變數

15.時間複雜度用於衡量一個演算法執行所耗費的時間,空間複雜度用於衡量演算法執行過程中臨時佔用的記憶體大小

16. GC即垃圾回收,自動管理記憶體,當我們建立物件時,系統會為物件分配一個記憶體空間,GC就開始監控這個物件的地址、大小以及使用情況,當物件沒有被任何引用指向,或者不再會被用到的時候,GC就把物件當作垃圾回收,釋放記憶體 。但是GC並不是實時性的,GC並不是能釋放所有的資源。它不能自動釋放非託管資源(正則表示式,資料庫連線,定時器)。減少new產生物件的次數 來減少GC

17.ref 關鍵字使引數按引用傳遞。使用 ref 引數,則方法定義和呼叫方法都必須顯式使用 ref 關鍵字。ref指定的引數在進入方法前必須初始化。out指定的引數在進入函式時會清空自己,必須在函式內部賦初值。如果一個方法採用 ref 引數,而另一個方法採用 out 引數,無法過載這兩個方法。

18.資料結構

雜湊表又稱散列表,是根據關鍵碼值(Key value)而直接進行訪問的資料結構,通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表,值型別。當一個HashTable被佔用一大半的時候我們通過計算雜湊值取得的地址值可能會重複指向同一地址,這就造成雜湊衝突。

字典是引用型別,一種變種的雜湊表,實現方式與雜湊表相同,但是在宣告的時候必須指定key和item的型別,它採用一種分離連結散列表的資料結構來解決雜湊衝突的問題。

陣列是最簡單的資料結構. 1.陣列儲存在連續的記憶體上。2.陣列的內容都是相同型別。3.陣列可以直接通過下標訪問,故索引時間非常快而且是固定的,與陣列大小內容無關。

ArrayList不必在宣告ArrayList時指定它的長度, 可以儲存不同型別的元素, 不是型別安全的。因為把不同的型別都當做Object來做處理,很有可能會在使用ArrayList時發生型別不匹配的情況。會導致大量拆箱,裝箱操作

List內部使用Array來實現,即確保了型別安全,也取消了裝箱和拆箱的操作,而且長度可以靈活變化。

連結串列LinkedList本身不是連續儲存,而是靠各物件的指標所決定,所以向連結串列中插入刪除元素的時候不用調整容量,但是訪問某個元素的時候只能從頭節點開始遍歷。