Unity筆試題彙總———僅個人經歷記錄

參考鏈接:https://blog.csdn.net/Sxl1713232929/article/details/78277510

參考鏈接:https://blog.csdn.net/fadbgfnbxb/article/details/88787361

 

1、Unity動態加載資源的方式有哪些?(10分)

Resources.Load()

AssetBundle

 

 

 

2、LOD是什麼,優缺點是什麼?(10分)

LOD(Level of detail)多層次細節,是最常用的遊戲優化技術。它按照模型的位置和重要程度決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算

 

 

 

3、請簡述abstract,const,readonly,static,virtual,override成員修飾符。(10分)

abstract:修飾方法的時候表示該方法需要由子類來實現,如果子類沒有實現該方法那麼子類同樣是抽象類;且含有抽象方法的類一定是抽象類。abstract不能和new同時用。

const:修飾字段,表示該字段爲只讀字段。並且在編譯時必須能夠明確知道該字段的值,其值是硬編碼到程序中去的,修改了該類型成員後需要重新編譯才能使修改生效。

readonly:修飾字段,表示該字段爲只讀字段。
   注意:readonly修飾引用類型時由於操作不當可能修改該只讀對象狀態。

   readonly是運行時只讀,內容在運行時確定,所以修改了readonly類型成員後無需重新編譯即可生效。

static:修飾構造函數時,構造函數不能含有任何參數,不能含有修飾符,構造函數不能對對象成員進行初始化操作。但是能夠對靜態成員進行初始化或者調用。在靜態構造函數中初始化的靜態成員爲最終初始化結果。

virtual:修飾方法成員,表示虛方法。父類可以含有該類的實現,子類可以覆寫該函數。

override:表示該方法爲覆寫了父類的方法。

 

4、請簡述值類型和引用類型的區別。(10分)

 區別:1. 值類型存儲在內存棧中,引用類型數據存儲在內存堆中,而內存單元中存放的是堆中存放的地址。 2. 值類型存取快,引用類型存取慢。 3. 值類型表示實際數據,引用類型表示指向存儲在內存堆中的數據的指針和引用。 4. 棧的內存是自動釋放的,堆內存是 .NET 中會由 GC 來自動釋放。 5. 值類型繼承自 System.ValueType, 引用類型繼承自 System.Object 。

 

 

 

 

5、請用C#編寫一個單例(Singleton)類。(10分)

 public enum SingletonDemo4 {
     INSTANCE;
     
     public static void saySomthing(String str){
        System.out.println("hello"+str);
     }
 }

 

 

 

 

6、請用C#寫一個選擇排序算法。(10分)

        /// <summary>
        /// 02選擇排序
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public static int[] SelectionSort(int[] array)
        {
            int temp = 0;
            for (int i = 0; i < array.Length - 1; i++)
            {
                int minVal = array[i]; //假設 i 下標就是最小的數
                int minIndex = i;
                for (int j = i + 1; j < array.Length; j++)
                {
                    if (minVal > array[j])
                    {
                        minVal = array[j];
                        minIndex = j;
                    }
                }
                temp = array[i];
                array[i] = array[minIndex];
                array[minIndex] = temp;

                printArray(array);
                Console.WriteLine("第" + (i + 1) + "趟");
            }
            return array;
        }

 

 

7、Unity3D的協同程序和C#線程之間的區別是什麼?請寫出Unity協同程序的執行代碼。(10分)

 

1) 一個線程可以多個協程,一個進程也可以單獨擁有多個協程。

2) 線程進程都是同步機制,而協程則是異步。

3) 協程能保留上一次調用時的狀態,每次過程重入時,就相當於進入上一次調用的狀態。

4)線程是搶佔式,而協程是非搶佔式的,所以需要用戶自己釋放使用權來切換到其他協程,因此同一時間其實只有一個協程擁有運行權,相當於單線程的能力。

5)協程並不是取代線程, 而且抽象於線程之上, 線程是被分割的CPU資源, 協程是組織好的代碼流程, 協程需要線程來承載運行, 線程是協程的資源, 但協程不會直接使用線程, 協程直接利用的是執行器(Interceptor), 執行器可以關聯任意線程或線程池, 可以使當前線程, UI線程, 或新建新程.。

6)線程是協程的資源。協程通過Interceptor來間接使用線程這個資源。
 

 

 

8、C#的委託是什麼?有何用處?(10分)

委託是C#實現回調函數的一種機制

 

 

 

 

 

9、請闡述Unity3D在移動設備上的一些優化資源的方法。(10分)

 

1.使用assetbundle,實現資源分離和共享,將內存控制到200m之內,同時也可以實現資源的在線更新

2.頂點數對渲染無論是cpu還是gpu都是壓力最大的貢獻者,降低頂點數到8萬以下,fps穩定到了30幀左右

3.只使用一盞動態光,不是用陰影,不使用光照探頭

粒子系統是cpu上的大頭

4.剪裁粒子系統

5.合併同時出現的粒子系統

6.自己實現輕量級的粒子系統

animator也是一個效率奇差的地方

7.把不需要跟骨骼動畫和動作過渡的地方全部使用animation,控制骨骼數量在30根以下

8.animator出視野不更新

9.刪除無意義的animator

10.animator的初始化很耗時(粒子上能不能儘量不用animator)

11.除主角外都不要跟骨骼運動apply root motion

12.絕對禁止掉那些不帶剛體帶包圍盒的物體(static collider )運動

NUGI的代碼效率很差,基本上runtime的時候對cpu的貢獻和render不相上下

13每幀遞歸的計算finalalpha改爲只有初始化和變動時計算

14去掉法線計算

15不要每幀計算viewsize 和windowsize

16filldrawcall時構建頂點緩存使用array.copy

17.代碼剪裁:使用strip level ,使用.net2.0 subset

18.儘量減少smooth group

19.給美術定一個嚴格的經過科學驗證的美術標準,並在U3D裏面配以相應的檢查工具

 

 

 

 

10、Vertex Shader是什麼,怎麼計算?(10分)

 

頂點着色(Vertex Shader)是一段執行在GPU上的程序(一般用HLSL來編寫),用來取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作頂點。

 

算法程序題:

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:

輸入: 123
輸出: 321
 示例 2:

輸入: -123
輸出: -321
示例 3:

輸入: 120
輸出: 21
注意:

假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231,  231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。

 

答案:

class Solution {
public:
    int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
};

作者:LeetCode
鏈接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
來源:力扣(LeetCode)

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