unity3d遊戲開發優化簡單說明
對於遊戲來說,流暢是最重要的條件,所以好的遊戲一定會有個好的優化,個人認為unity3d遊戲開發優化應從3塊下手:CPU、記憶體、GPU
1.Draw Calls(CPU呼叫底層圖形介面):Draw Call Batching(動批)和Static Batching (靜批)
Draw Call Batching(動批) 滿足條件
1.一般大型手機遊戲,雙核的手機,Tris(面)最好小於2萬,4核的手機最好不能超過4~5萬左右
2.一般不關心模型是什麼樣子,也不關心是幾個模型,只要這些模型的頂點數少於300個,並且用的是相同材質且是單pass的,就能參與動態批處理
3.縮放可能會影響bathces,也可能不影響,看unity版本,一般5.以後的版本不影響
4.只有Mesh Renderer的模型才支援動態批處理
5.Skinned Mesh Renderer 是骨骼或者人物蒙皮渲染,是不支援動批的
6.所有參與過燈光烘焙的物體,因為是靜態的,所以不能動態批處理
Static Batching (靜批)(一般能用靜批的儘量用靜批)滿足條件
1.必須是靜態(對於有沒有烘焙,不關心)
2.無頂點要求
3.和shader無關(單pass或者雙pass都無關),只和材質有關
4.靜態物體是不支援縮放的,如果進行縮放,則不會靜態批處理
移動端Draw Calls 優化:(重要)
1.建議Draw Calls 在100左右(雙核處理器) ,四核處理器建議在200~300
2..物理方面(元件和引擎)
1.碰撞(呼叫最底層物理引擎,消耗cpu效能),優先使用box collider,儘量不用mesh collider。
2.碰撞層(不需要碰撞的層,取消打勾,這個比較重要)
3.幀數優化(移動端建議0.033,就是1秒鐘30幀。pc端效能普遍較好,建議0.01)(至於VR和AR建議次數更多,這個值和fps相關聯的,就這一句話,可能是VR和AR開發人員的福音。)
4.建議選擇Don‘t Sync(關閉垂直同步),然後在C#遊戲入口程式碼裡面的Awake或者Start裡面寫上
Application.targetFrameRate = XX;(移動端建議30,PC端建議60.這個重要的不要不要的,為什麼移動的幀數是30?,不深入,總之不要太高,否則消耗效能不說,cpu還會發燙)
【步驟3和4請同時操作】
3.程式碼優化
1.少用反射,ios開發的可以忘了反射(不是不用哈,少用)
2.務必在工程釋出前刪除程式碼裡面的Debug.Log和print (重要,這2個比較消耗效能)
3.不要頻繁建立或例項化或銷燬物件,請使用物件池(Pool)(重要)。
4.同一指令碼中頻繁使用的變數建議宣告其為全域性變數,指令碼之間頻繁呼叫的變數或方法建議宣告為全域性靜態變數或方法。(重要)
5.不要去頻繁獲取元件,將其宣告為全域性變數.
6.用簡單的“for”迴圈代替“foreach”迴圈。
7.陣列、集合類元素優先使用Array,其次是List,少用ArrayList(會拆裝箱操作)。
8.在迴圈語句力裡面,不要直接訪問gameobject的tag屬性。比如if (go.tag == “human”)最好換成if (go.CompareTag (“human”))。因為訪問物體的tag屬性會在堆上額外的分配空間。如果在迴圈中這麼處理,會留下垃圾。
9.儘量少用模運算和除法運算,比如a/5f,一定要寫成a*0.2f。
10.String的相加操作,會頻繁申請記憶體並釋放,導致gc頻繁,使用System.Text.StringBuilder代替
11.Update少用,少在Update裡面做迴圈,更少做複雜操作。