參考鏈接: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)