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