1、Draw Call
2、資源(模型、貼圖、粒子)
3、渲染(相機,光照,Shader)
4、網絡
5、代碼(代碼編寫,資源加載,物理系統)
可以在Profiler窗口查看項目性能消耗主要在那幾個地方,然後有針對性的進行優化
下面給大家分享一些常用的代碼方面的內容
1、在場景中有大量物體頻繁的激活或隱藏時,不適用SetActive(),在需要隱藏的時候移除屏幕,顯示的時候移到屏幕內(也就是修改物體的位置)。還有一個方法,就是把需要隱藏的物體設置爲一個已經隱藏的物體的子物體(父物體是隱藏的,子物體自然也看不到),這種方法和SetActive()方法差不多,不推薦使用。
2、動態實例化到場景中的物體,名字都會有一個後綴(Clone),但是爲了方便識別,會修改它的名字,這樣同樣會產生性能消耗。
3、在不影響正常運行結果的情況下,減少對Update或者FixUpdate的調用次數
假設顯示將所有的Update刷新邏輯寫在RefreshUpdate中
void RefreshUpdate()
{
Debug.Log("RefreshUpdate");
}
3-1每隔一定幀數,執行一次RefreshUpdate();
int SpaceCount=10;
int UpdateCount;
void Update()
{
if(UpdateCount % SpaceCount==0)
{
UpdateCount =0;
}
UpdateCount ++;
}
3-2使用協程While(true)循環,每次循環間隔一定的時間,調用RefreshUpdate(),需要在Satrt函數中開啓協程
float SpaceTime=0.1f;
IEnumerator StartUpdate()
{
While(true)
{
RefreshUpdate();
yield return new WaitForSeconds(SpaceTime);
}
}
3-3 使用InvokeRepeating循環調用RefreshUpdate();
float RepaetTime=0.1f;
void Start()
{
InvokeRepeating("RefreshUpdate",0,RepaetTime);
}
4、使用對象池
操作目標相對較少,可簡化對象池,實現效果。
5、音效播放時,爲避免頻繁創建、銷燬播放器,可以對音效統一管理
6、場景中經常需要動態生成GameObject,當一次創建的數量交多的時候,在不影響使用的情況下,可以使用協程,在多幀內完成創建
7、部分簡單的物理計算可以不適用Unity提供的物理系統,簡化物理計算量
8、選擇合理的數據結構存儲數據
9、儘量避免在Update和for循環內創建臨時變量
10、儘量避免創建臨時字符串
11、能使用for循環的,就不用foreach
12、每個繼承MonoBehaviour的類,都會自動生成Update方法,但是很多類是使用不到Update的,這個時候需要將其刪除,畢竟實時調用孔方法,多少還是有消耗的。
13、數值計算中使用乘法而不用除法,比如:A/2,可以寫成A*0.5F;
14、在比較Tag的時候,使用if(gameObject.CompareTag("Tag")),而不是if(gameObject.tag=="Tag")