程序筆試題(Unity部分)--20220217
1.請描述Monobehavior中OnEnable,Start,Awake函數(shù)的執(zhí)行順序。
????????Awake OnEnable Start;
2.請描述裝箱/拆箱的優(yōu)缺點。
????????優(yōu)點:可以滿足值類型和引用類型之間的轉換。
????????缺點:裝箱需要在托管堆中分配內存,分配的內存量是值類型各字段所需的內存量還需要加上托管堆所有對象都有的兩個額外內存量(對象指針和同步塊索引)。在拆箱的過程中也需要將字段包含的值從堆中復制到基于棧的值類型實例當中。裝箱和拆箱會對程序運行速度和內存消耗產生不利影響。
3.請描述堆和棧的區(qū)別。
????數(shù)據類型區(qū)分:值類型存放在棧中,引用類型先在棧中存放對應的引用地址,然后在對中分配空間存放數(shù)據。
????讀取速度和空間:??臻g小,讀取速度快。堆空間大,讀取速度慢。
????內存管理:棧根據后進先出的原則,依次分配和釋放對象,使用完畢立即釋放,托管堆內存對象的釋放受垃圾收集機制(GC)的管理。
4.請列舉多線程同步的方式,并比較優(yōu)缺點。
????多線程同步方式有:C# Thread,Task await/async。
????優(yōu)點:多線程同步方式可以避免主線程卡頓,Task異步是C#中的新語法使用了線程池。
????缺點:C# Thread線程無法訪問Unity組件。
5.List和Dictionary在遍歷,查找,插入操作上效率有什么不同?
????List是在數(shù)組的基礎上做的封裝,遍歷查詢更快。Dictionary單條查詢更快。在遍歷時Dictionary內存不連續(xù)會產生大量的內存換頁操作,List只需要最少的內存換頁即可。
????在尾部插入數(shù)據時,List只需要在其原有的地址基礎上向后延續(xù)存儲即可,Dictionary需要經過復雜的Hash計算。
6.Unity協(xié)程是在單線程還是多線程的環(huán)境下實現(xiàn)的?請說明原因。
????Unity協(xié)程是在單線程的環(huán)境下實現(xiàn)的。Unity中的協(xié)成在執(zhí)行過程中是通過yield retrun 將程序掛起,等到特定的時間才執(zhí)行接下來的內容,具體掛起的程序什么時候執(zhí)行,是根據MonoBehavior的生命周期決定的。
7.請例舉幾種減少GC的有效代碼措施。
????1.減少裝箱操作,使用泛型;
????2.使用對象池;
????3.盡量避免大對象的分配,減少對象引用數(shù)量;
????4.使用for代替foreach;
????5.字符串連接時是可以使用StringBuilder;
????6. yield return 0使用 null 代替;
????7.避免使用LINQ、正則表達式;
8.已知一個二叉樹根節(jié)點,請寫一個函數(shù),計算包括根結點本身在內的所有子節(jié)點數(shù)(數(shù)據結構請自定義,建議采購匈牙利命名法)。
public class TreeNode
{
public int iData = 0;
public TreeNode leftNode = null;
public TreeNode rightNode = null;
public TreeNode(int value)
{
This.iData = value;
}
public TreeNode(int value,TreeNode left,TreeNode right)
{
this.left = left;
this.right = right;
this.iData = value;
}
}
public void DisplayMiddle(TreeNode node)
{
if(node != null)
{
DispalyMiddle(node.leftNode);
Debug.Log(node.iData);
DispalyMiddle(node.rightNode);
}
}