• 招生咨詢熱線:4008-569-579 
  • 手機(jī)版
    用手機(jī)掃描二維碼直達(dá)商品手機(jī)版
招生咨詢熱線
4008-569-579
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料 > Unity如何解決游戲中的卡頓問(wèn)題
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料>Unity如何解決游戲中的卡頓問(wèn)題

Unity如何解決游戲中的卡頓問(wèn)題

來(lái)源:廣州達(dá)內(nèi)教育        時(shí)間:2023-05-30        熱度:38℃        返回列表

   游戲現(xiàn)在已經(jīng)成為大家社交、解壓的一種方式了,可以說(shuō)現(xiàn)在的游戲已經(jīng)融入到人們生活中的點(diǎn)點(diǎn)滴滴了。對(duì)于游戲的游戲肯定也是越來(lái)越高了,對(duì)于在玩游戲的時(shí)候大家都不想回出現(xiàn)有卡頓的問(wèn)題的,那么unity如何解決游戲中的卡頓問(wèn)題呢?怎么樣才可以讓顧客的體驗(yàn)更好呢?


  1、首先,先要了解下什么是Mono內(nèi)存


  對(duì)于目前絕大多數(shù)基于Unity引擎開(kāi)發(fā)的項(xiàng)目而言,其托管堆內(nèi)存是由Mono分配和管理的?!巴泄堋?的本意是Mono可以自動(dòng)地改變堆的大小來(lái)適應(yīng)你所需要的內(nèi)存,并且適時(shí)地調(diào)用垃圾回收(Garbage Collection)操作來(lái)釋放已經(jīng)不需要的內(nèi)存,從而降低開(kāi)發(fā)人員在代碼內(nèi)存管理方面的門檻。


  目前絕大部分Unity游戲邏輯代碼所使用的語(yǔ)言為C#,C#代碼所占用的內(nèi)存又稱為mono內(nèi)存,這是因?yàn)?/span>Unity是通過(guò)mono來(lái)跨平臺(tái)解析并運(yùn)行C#代碼的,在Android系統(tǒng)上,游戲的lib目錄下存在的libmono.so文件,就是monoAndroid系統(tǒng)上的實(shí)現(xiàn)。C#代碼通過(guò)mono解析執(zhí)行,所需要的內(nèi)存自然也是由mono來(lái)進(jìn)行分配管理。


  2、然后,來(lái)了解什么是Mono內(nèi)存管理策略


  Mono通過(guò)垃圾回收機(jī)制(Garbage Collect,簡(jiǎn)稱GC)對(duì)內(nèi)存進(jìn)行管理。Mono內(nèi)存分為兩部分,已用內(nèi)存(used)和堆內(nèi)存(heap),已用內(nèi)存指的是mono實(shí)際需要使用的內(nèi)存,堆內(nèi)存指的是mono向操作系統(tǒng)申請(qǐng)的內(nèi)存,兩者的差值就是mono的空閑內(nèi)存。


  當(dāng)mono需要分配內(nèi)存時(shí),會(huì)先查看空閑內(nèi)存是否足夠,如果足夠的話,直接在空閑內(nèi)存中分配,否則mono會(huì)進(jìn)行一次GC以釋放更多的空閑內(nèi)存,如果GC之后仍然沒(méi)有足夠的空閑內(nèi)存,則mono會(huì)向操作系統(tǒng)申請(qǐng)內(nèi)存,并擴(kuò)充堆內(nèi)存。


  通過(guò)上文可知,GC的主要作用在于從已用內(nèi)存中找出那些不再需要使用的內(nèi)存,并進(jìn)行釋放。Mono中的GC主要有以下幾個(gè)步驟:1.停止所有需要mono內(nèi)存分配的線程。2.遍歷所有已用內(nèi)存,找到那些不再需要使用的內(nèi)存,并進(jìn)行標(biāo)記。3.釋放被標(biāo)記的內(nèi)存到空閑內(nèi)存。


     3、重新開(kāi)始被停止的線程。


  除了空閑內(nèi)存不足時(shí)mono會(huì)自動(dòng)調(diào)用GC外,也可以在代碼中調(diào)用GC.Collect()手動(dòng)進(jìn)行GC,但是,GC本身是比較耗時(shí)的操作,而且由于GC會(huì)暫停那些需要mono內(nèi)存分配的線程(C#代碼創(chuàng)建的線程和主線程),因此無(wú)論是否在主線程中調(diào)用,GC都會(huì)導(dǎo)致游戲一定程度的卡頓,需要謹(jǐn)慎處理。另外,GC釋放的內(nèi)存只會(huì)留給mono使用,并不會(huì)交還給操作系統(tǒng),因此mono堆內(nèi)存是只增不減的。


  4、,要了解什么是Mono內(nèi)存泄漏


  Mono是如何判斷已用內(nèi)存中哪些是不再需要使用的呢?是通過(guò)引用關(guān)系的方式來(lái)進(jìn)行的。Mono會(huì)跟蹤每次內(nèi)存分配的動(dòng)作,并維護(hù)一個(gè)分配對(duì)象表,當(dāng)GC的時(shí)候,以全局?jǐn)?shù)據(jù)區(qū)和當(dāng)前寄存器中的對(duì)象為根節(jié)點(diǎn),按照引用關(guān)系進(jìn)行遍歷,對(duì)于遍歷到的每一個(gè)對(duì)象,將其標(biāo)記為活的(alive)


  解決辦法


  對(duì)于mono內(nèi)存泄漏,一般只能通過(guò)猜測(cè)+不斷修改代碼測(cè)試的方法來(lái)修復(fù)問(wèn)題,效率很低,騰訊Wetest平臺(tái)的Cube工具提供了mono內(nèi)存快照對(duì)比的功能,并包括對(duì)象分配堆棧,對(duì)象引用關(guān)系等詳細(xì)信息,是定位mono內(nèi)存泄漏問(wèn)題的一大利器。


  以上就是達(dá)內(nèi)科技的unity培訓(xùn)的講師給大家講解的關(guān)于unity如何解決游戲中的卡頓問(wèn)題,如果說(shuō)你想要學(xué)好unity技術(shù)的話,那么還是要先把以上達(dá)內(nèi)科技的講師給大家所講解的內(nèi)容理清。達(dá)內(nèi)科技?xì)g迎每位想要學(xué)習(xí)unity技術(shù)的學(xué)員來(lái)我們公司的unity培訓(xùn)班進(jìn)行實(shí)地考察,獲取是也可以點(diǎn)擊我們文章下面的獲取試聽(tīng)資格按鈕來(lái)獲取我們的unity培訓(xùn)免費(fèi)試聽(tīng)資格,來(lái)和我們的講師進(jìn)行面對(duì)面的交流和互動(dòng)。

電話咨詢

電話咨詢

咨詢電話:
4008-569-579
回到頂部

回到頂部