打算年底找作業,所以趁著年前整理波面試題,下面是部分內容,更多內容可以通過底部關注我的公眾號獲取,

1.UI的優化方案
記錄最全面的ugui優化策略_bommy游戲的博客-CSDN博客
2.圖集的壓縮格式

3.減少GC的方式
Unity優化之GC——合理優化Unity的GC - zblade - 博客園
Unity GC垃圾回識訓制_小程小程,永不消沉-CSDN博客
4.動態批處理與靜態批處理相關
關于靜態批處理/動態批處理/GPU Instancing /SRP Batcher的詳細剖析 - 知乎
Unity的靜態批處理和動態批處理_Hello Mingo-CSDN博客_unity 批處理
最近面試遇到的靜態合批合靜態合批?簡單整理一下; - 代王是我 - 博客園
5.記憶體泄漏原因,危害,解決方案
深入淺出再談Unity記憶體泄漏 - 簡書
6.資源加載優化分析,解決
Unity加載模塊深度決議(紋理篇) - UWA Blog
關于Unity加載優化,你可能遇到這些問題 - UWA Blog
7.unity中的深淺拷貝
Unity物件的所有組件深拷貝與粘貼_cartzhang的專欄-CSDN博客
8.unity中碰撞檢測機制
深入理解Unity的碰撞檢測機制 - 簡書
9.unity中常見性能問題,解決分析
Unity問答-性能調優_王利威的博客-CSDN博客
10.GC回收演算法,原理
C#技術漫談之垃圾回識訓制(GC)(轉) - nele - 博客園
11.一條射線,一個面,如何檢測相交的點(射線檢測原理)
12動態合批的條件是什么?會造成開銷么?如果會,開銷有哪些?
- Dynamic Batching 是在物件小于300的條件下(不論物件是否為靜態或動態),在使用相同材質球下,unity就會自動幫你合并成一個Batch送往GPU來處理,
- unity在運行的時可以將一些物體進行合并,從而用一個繪制呼叫來渲染他們,這一操作我們稱之為“批處理”,一般來說,unity批處理的物體越多,你就會得到越好的渲染性能,
- 動態批處理操作是自動完成的,并不需要你進行額外的操作,
- 批處理動態物體需要在每個頂點上進行一定的開銷,所以動態批處理僅支持小于900頂點的網格物體,
- 預設體的實體會自動地使用相同的網路模型和材質,
13.靜態合批的原理是什么?會造成開銷么?如果會,開銷有哪些?
- 靜態批處理:游戲匯出時,在player setting中勾選static batching,匯出包的時候就進行批處理,匯出來的包就會比較大, 在游戲場景中勾選場景的static選項,在加載場景時,會進行一次靜態批處理合并,匯出來的包不大,但加載時會使記憶體變大,
- 場景中有4個物體,如果都勾選靜態選項,在進行靜態批處理的時候,引擎會判斷這4個物體是否共用同一渲染材質,如果共用同一渲染材質,則會將這4個物體視為可批處理的物件,引擎會基于單個渲染物件的大小拷貝出3個,共變為4個人Mesh,這時4個Mesh會存在一個indexbuffer中,會讓資源占用記憶體變大4倍,在渲染的時候,是將這個更大的mesh傳遞給GPU進行渲染操作的,
- 如果CPU的運行速度較慢,則GPU會出現等待CPU的情況,此時喲咻主要受CPU的限制, CPU在游戲中的主要作用是設定渲染狀態和呼叫DC,如果每個物體的材質和貼圖都不一樣,CPU主要作業就是設定物體的渲染狀態,呼叫DC也會更多,此時渲染狀態的改變更消耗性能,游戲運行會變慢,所以,對于大量的不需要改變位置的物體,都會采用靜態批處理的方式解決渲染狀態的瓶頸,
14.Unity 協程和執行緒,行程的區別
- 其實很簡單,首先需要理解行程和執行緒是怎么一回事:行程是Windows系統中的一個基本概念,他包含著運行一個程式所需要的基本資源,一個正在運行的應用程式在作業系統中被視為一個行程,行程可以包括一個或多個執行緒,
- 行程和執行緒的區別通過以上,一目了然,
- 再談談執行緒和協程的區別,一般應用一個應用程式只使用執行緒這一“資源”,
- 需要明確,Unity只使用了一個執行緒,但是,我們需要”同時做很多事“,那Unity作為單執行緒,該如何去做,協程,就來了,協程是一種”偽執行緒“, 協同程式(coroutine).,即協作式程式,一系列互相依賴的協程間依次使用CPU,每次只有一個協程作業,而其他協成處于休眠狀態,協程實際上是在一個執行緒中,只不過每個協程對CPU進行分時,協程可以訪問和使用unity的所有方法和component,
- 同一時間只能執行某個協程,協程適合對某個任務進行分時處理,
- 控制代碼在特定的時間執行,
- 協程不是執行緒,也不是異步執行,跟Update一樣,在主執行緒中執行,
- 不用考慮同步和鎖的問題,
- 協程是一個分部組件,遇到條件(yield return)會掛起,直到條件滿足才會被喚起執行后面的陳述句,
15.第一次執行GameObject.Instantiate的時候有明顯卡頓,該怎么解決?
Instantiate的卡頓與三部分開銷相關:相關資源加載、腳本組件的序列化和建構式的執行,并且絕大部分原因均是相關資源加載導致,所以,我們的建議如下:
1、通過 Profiler 查看 Instantiate 具體的CPU分配情況;
2、如果是資源加載導致的性能瓶頸,則一方面通過簡化資源來緩解CPU耗時壓力,另一方面通過 AssetBundle 依賴關系打包將資源預先加載,即將此處 Instantiate 的總體耗時拆分,平攤到之前幀進行執行(比如切換場景處等),從而讓 Instantiate 實體化操作的區域耗時更加平滑;
3、如果是腳本組件序列化導致的性能瓶頸,則可嘗試減少腳本中的序列化資訊;
4、如果是建構式的執行導致的性能瓶頸,一般只能在策略上進行規避,比如降低 Instantiate 的呼叫頻率等,
更多面試內容可以關注我的公眾號,回復"面試"即可領取

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/349737.html
標籤:其他
