程式碼效能優化3:函式優化
阿新 • • 發佈:2018-12-15
程式碼中函式呼叫無時無刻,那麼哪些函式會產生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中解決了這個問題
看你自己版本好了