unity 減少GC回收


兩種情況GC會被觸發:

  1. 堆的內存不足時自動調用GC。
  2. 手動的調用GC。


減少GC回收要注意一下問題:SFT池GCNL


  1. 字符串連接的處理。使用StringBuilder或String.Format來代替而不是用”+”來進行連接。因為將兩個字符串連接的過程,其實是生成一個新的字符串的過程。而之前的舊的字符串就成為了垃圾。而作為引用類型的字符串,其空間是在堆上分配的,被棄置的舊的字符串的空間會被GC當做垃圾回收。
  2. 盡量不要使用foreach,而是使用for。foreach會涉及到迭代器enumerator的使用,而據傳說每一次循環所產生的迭代器會帶來24 Bytes的垃圾。那么循環10次就是240Bytes。
  3. 不要直接訪問gameobject的tag屬性。比如if (go.tag == “human”)最好換成if (go.CompareTag (“human”))。因為訪問物體的tag屬性會在堆上額外的分配空間。如果在循環中這么處理,留下的垃圾更多。
  4. 使用“池”,以實現空間的重復利用。
  5. 盡可能避免使用LINQ。部分功能無法在某些平台上使用,會分配大量GC Alloc。而且我很討厭LINQ的一點就是它有可能在某些情況下無法很好的進行AOT編譯。比如“OrderBy”會生成內部的泛型類“OrderedEnumerable”。這在AOT編譯時是無法進行的,因為它只是在OrderBy的方法中才使用。所以如果你使用了OrderBy,那么在IOS平台上也許會報錯。
  6. 緩存組件:

           1.每次GetComponent均會分配一定的GC Allow.

           2.每次Object.name都會分配39B的堆內存.


  7. 協程Coroutine,開啟一個協程,至少分配373的內存。
  8. 盡量減少New的使用。
  9. Lambda表達式,使用不當會產生內存泄漏。
  10. 用Struct代替Class。
  11. 委托也會產生GC,在init方法中事先處理好。

參考文章:深入淺出聊優化:從Draw Calls到GC


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com