Unity3d性能1:GC分析

這段時間看了一些針對GC的文章,感覺應該整理一下。首先分析一個課題需要明確該課題的意義,定義,結(jié)論。通過本文閱讀,可以解答如下問題:


1 GC是什么?

2 GC是如何產(chǎn)生的?

3 GC給u3d應用帶來了什么問題?

4 在u3d中如何定位這些GC問題?

5 如何在u3d中解決GC帶來的問題


1 GC是什么?

GC是.net框架中用來自動管理內(nèi)存的機制。針對u3d來說,通常使用C#來編寫。C#中存在值類型與引用類型,值類型存儲在棧上,引用類型存儲在托管堆上,對于棧上面的數(shù)值,一般是生命周期較短數(shù)據(jù)較小的,所以棧內(nèi)存的管理無需理會,mono會自動的解決。那么剩下堆內(nèi)存的管理,這就用到了GC。堆內(nèi)存上面一般存儲數(shù)據(jù)大而且生命周期不確定的數(shù)據(jù),應用程序使用過程中需要不斷的在堆內(nèi)存上分配空間供新變量使用,當空間不足時,GC會調(diào)用,首先會查找堆內(nèi)存上哪些對象已經(jīng)不被應用或者其他對象調(diào)用了,然后把這些對象標記下來,再刪除這些對象,這樣就有了新的空間來分配,這就是GC的原理。


2 為什么會出現(xiàn)GC呢?

當我們明白了GC的原理之后,這個問題變得簡單了。

1)當應用分配空間時,如果空間不足就會出現(xiàn)GC。

2)系統(tǒng)自動調(diào)用GC,不同平臺頻率不同。

3)GC強制調(diào)用,手動調(diào)用。


3 Mono的GC會給我們帶來什么問題呢?

1)GC的時間問題: 如果堆內(nèi)存上變量/引用/對象太多,GC執(zhí)行的時候需要去遍歷所有對象,檢查該對象是否被用,導致GC緩慢,性能低下,應用卡頓遲緩。

2)內(nèi)存碎片化嚴重:如果堆內(nèi)存上空間碎片化嚴重,各個變量對象之間存在間隙,會導致應用無法分配大塊的空間供較大的變量使用,此時系統(tǒng)會讓GC頻繁執(zhí)行,或者讓堆空間不斷重新分配,導致性能低下。其實對內(nèi)存碎片化嚴重是由于GC不斷的執(zhí)行導致的,當GC執(zhí)行的時候,清理掉變量空出來的空間不會進行重組合并,導致可用變量之間存在間隙空白,這些空白雖然組合起來夠用,但是它不會組合。


4 如何在u3d中定位GC問題?

在profiler window中CPU usage欄中的GC alloc選項就代表了每一項GC清理的垃圾,可以定位到具體的函數(shù)。


5 如何解決GC帶來的問題?

本篇文章先講解策略,下篇文章繼續(xù)講解常見問題。

方向上來講,

1 GC時間的降低,

2 GC調(diào)用頻率的降低,

3 GC延遲時間降低

4 盡量少的產(chǎn)生垃圾

5 場景加載的時候或者沒有玩家操作的時候,手動執(zhí)行GC。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容