1. 程式人生 > >程式碼效能優化3:函式優化

程式碼效能優化3:函式優化

程式碼中函式呼叫無時無刻,那麼哪些函式會產生gc呢?

1.自己寫的函式中有new物件被頻繁呼叫

2.Unity自帶的函式和自己新增的第三方外掛中不知道的new物件

接下來的介紹中用自定義函式和第三方函式區分

自定義函式分為:

1.每隔一段時間呼叫的

2.多個物件中新增並呼叫的

遵循一個原則:能複用則複用

哪些可以複用:list dictionary 物件元件,放在start函式中,用到就clear()

(注:Vector3本質是struct,只是new語法相似而已)

那還有一些程式碼中實現了並且要一直new的呢?

方法1:能新增判斷就加一個,畢竟if(count>1)不消耗什麼效能

方法2:非高頻率的新增計時器

方法3:建立一次多次複用(常見實現,物件池)

常見函式替換:

GameObject.CompareTag替換gameObject.tag == “”

Input.GetTouch()和Input.touchCount()來代替Input.touches

Physics.SphereCastNonAlloc()來代替Physics.SphereCastAll()

(後面兩種編輯器下會提示棄用的,update中獲取GetComponent<T>Editor會警告)

注意:當一個匿名函式中存在外部成員變數,會產生GC

委託會產生GC,不是必要少用

原因:

匿名方法現在要求該方法能夠訪問方法範圍之外的變數狀態,因此已成為閉包。

C#生成一個匿名類,用於傳遞資料(這就是原因)

通常,最好儘可能避免C#中的閉包。應該在效能敏感的程式碼中最小化匿名方法和方法引用,尤其是在基於每幀執行的程式碼中。

少用foreach,多用for

unity5.5以前的版本中,在foreach的迭代中都會生成記憶體垃圾,主要來自於其後的裝箱操作。每次在foreach迭代的時候,都會在堆記憶體上生產一個System.Object用來實現迭代迴圈操作。在unity5.5中解決了這個問題

看你自己版本好了