游戲現(xiàn)在已經(jīng)成為大家社交、解壓的一種方式了,可以說現(xiàn)在的游戲已經(jīng)融入到人們生活中的點點滴滴了。對于游戲的游戲肯定也是越來越高了,對于在玩游戲的時候大家都不想回出現(xiàn)有卡頓的問題的,那么unity如何解決游戲中的卡頓問題呢?怎么樣才可以讓顧客的體驗更好呢?
1、首先,先要了解下什么是Mono內(nèi)存
對于目前絕大多數(shù)基于Unity引擎開發(fā)的項目而言,其托管堆內(nèi)存是由Mono分配和管理的?!巴泄堋?的本意是Mono可以自動地改變堆的大小來適應(yīng)你所需要的內(nèi)存,并且適時地調(diào)用垃圾回收(Garbage Collection)操作來釋放已經(jīng)不需要的內(nèi)存,從而降低開發(fā)人員在代碼內(nèi)存管理方面的門檻。
目前絕大部分Unity游戲邏輯代碼所使用的語言為C#,C#代碼所占用的內(nèi)存又稱為mono內(nèi)存,這是因為Unity是通過mono來跨平臺解析并運行C#代碼的,在Android系統(tǒng)上,游戲的lib目錄下存在的libmono.so文件,就是mono在Android系統(tǒng)上的實現(xiàn)。C#代碼通過mono解析執(zhí)行,所需要的內(nèi)存自然也是由mono來進行分配管理。
2、然后,來了解什么是Mono內(nèi)存管理策略
Mono通過垃圾回收機制(Garbage Collect,簡稱GC)對內(nèi)存進行管理。Mono內(nèi)存分為兩部分,已用內(nèi)存(used)和堆內(nèi)存(heap),已用內(nèi)存指的是mono實際需要使用的內(nèi)存,堆內(nèi)存指的是mono向操作系統(tǒng)申請的內(nèi)存,兩者的差值就是mono的空閑內(nèi)存。
當mono需要分配內(nèi)存時,會先查看空閑內(nèi)存是否足夠,如果足夠的話,直接在空閑內(nèi)存中分配,否則mono會進行一次GC以釋放更多的空閑內(nèi)存,如果GC之后仍然沒有足夠的空閑內(nèi)存,則mono會向操作系統(tǒng)申請內(nèi)存,并擴充堆內(nèi)存。
通過上文可知,GC的主要作用在于從已用內(nèi)存中找出那些不再需要使用的內(nèi)存,并進行釋放。Mono中的GC主要有以下幾個步驟:1.停止所有需要mono內(nèi)存分配的線程。2.遍歷所有已用內(nèi)存,找到那些不再需要使用的內(nèi)存,并進行標記。3.釋放被標記的內(nèi)存到空閑內(nèi)存。
3、重新開始被停止的線程。
除了空閑內(nèi)存不足時mono會自動調(diào)用GC外,也可以在代碼中調(diào)用GC.Collect()手動進行GC,但是,GC本身是比較耗時的操作,而且由于GC會暫停那些需要mono內(nèi)存分配的線程(C#代碼創(chuàng)建的線程和主線程),因此無論是否在主線程中調(diào)用,GC都會導(dǎo)致游戲一定程度的卡頓,需要謹慎處理。另外,GC釋放的內(nèi)存只會留給mono使用,并不會交還給操作系統(tǒng),因此mono堆內(nèi)存是只增不減的。
4、,要了解什么是Mono內(nèi)存泄漏
Mono是如何判斷已用內(nèi)存中哪些是不再需要使用的呢?是通過引用關(guān)系的方式來進行的。Mono會跟蹤每次內(nèi)存分配的動作,并維護一個分配對象表,當GC的時候,以全局數(shù)據(jù)區(qū)和當前寄存器中的對象為根節(jié)點,按照引用關(guān)系進行遍歷,對于遍歷到的每一個對象,將其標記為活的(alive)。
解決辦法
對于mono內(nèi)存泄漏,一般只能通過猜測+不斷修改代碼測試的方法來修復(fù)問題,效率很低,騰訊Wetest平臺的Cube工具提供了mono內(nèi)存快照對比的功能,并包括對象分配堆棧,對象引用關(guān)系等詳細信息,是定位mono內(nèi)存泄漏問題的一大利器。
以上就是達內(nèi)科技的unity培訓(xùn)的講師給大家講解的關(guān)于unity如何解決游戲中的卡頓問題,如果說你想要學(xué)好unity技術(shù)的話,那么還是要先把以上達內(nèi)科技的講師給大家所講解的內(nèi)容理清。達內(nèi)科技歡迎每位想要學(xué)習(xí)unity技術(shù)的學(xué)員來我們公司的unity培訓(xùn)班進行實地考察,獲取是也可以點擊我們文章下面的獲取試聽資格按鈕來獲取我們的unity培訓(xùn)免費試聽資格,來和我們的講師進行面對面的交流和互動。