背景交代
成都創(chuàng)新互聯(lián)專注于尼瑪網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供尼瑪營(yíng)銷型網(wǎng)站建設(shè),尼瑪網(wǎng)站制作、尼瑪網(wǎng)頁(yè)設(shè)計(jì)、尼瑪網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造尼瑪網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供尼瑪網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。創(chuàng)新互聯(lián)專注于當(dāng)雄網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供當(dāng)雄營(yíng)銷型網(wǎng)站建設(shè),當(dāng)雄網(wǎng)站制作、當(dāng)雄網(wǎng)頁(yè)設(shè)計(jì)、當(dāng)雄網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造當(dāng)雄網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供當(dāng)雄網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。成都創(chuàng)新互聯(lián)公司專注于榆中網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供榆中營(yíng)銷型網(wǎng)站建設(shè),榆中網(wǎng)站制作、榆中網(wǎng)頁(yè)設(shè)計(jì)、榆中網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造榆中網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供榆中網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。最近QC同學(xué)在跑游戲的過程中發(fā)現(xiàn)玩的時(shí)間久了游戲會(huì)發(fā)生閃退,經(jīng)過搜集信息后排除了功能性bug的
一.判斷是否是內(nèi)存泄露
拿到真機(jī),USB連接,殺掉多余后臺(tái)進(jìn)程,打開Perfdog,接下來一頓操作猛如虎,Perfdog具體操作不在贅述,有關(guān)perfdog怎么使用的教程可以參考
Perfdog使用教程
拿到內(nèi)存趨勢(shì)圖
使用手機(jī)
此圖一出,基本就可以斷定內(nèi)存泄露了,這是正常玩游戲,游戲運(yùn)行了30分鐘的內(nèi)存趨勢(shì)圖;
結(jié)論:,內(nèi)存持續(xù)上升,存在內(nèi)存泄露。
一個(gè)優(yōu)秀的游戲通常情況內(nèi)存是有上升有回落,多次運(yùn)行同一個(gè)功能也不會(huì)導(dǎo)致內(nèi)存功能持續(xù)上升;
呈現(xiàn)出起伏狀態(tài),比如:
知道了存在內(nèi)存泄露,下面就要開始分析有可能是哪里導(dǎo)致的內(nèi)存泄露;
二.分析泄露原因
一般針對(duì)unity游戲來說,內(nèi)存瓶頸是資源和Mono堆內(nèi)存,兩部分;
以下是unity游戲程序在運(yùn)行時(shí)的內(nèi)存分配概況
先簡(jiǎn)單介紹下Mono,unity使用Mono機(jī)制來完成跨平臺(tái)的操作,就好像JAVA使用虛擬機(jī)來完成跨平臺(tái)操作一樣,Mono也是一種跨平臺(tái)的實(shí)現(xiàn)。跨平臺(tái)其實(shí)現(xiàn)原理在于使用了叫CIL(Common Intermediate Language通用中間語(yǔ)言,也叫做MSIL微軟中間語(yǔ)言)的一種代碼指令集,CIL可以在任何支持CLI(通用語(yǔ)言基礎(chǔ)結(jié)構(gòu))的環(huán)境中運(yùn)行,就像.NET是微軟對(duì)這一標(biāo)準(zhǔn)的實(shí)現(xiàn),Mono則是對(duì)CLI的又一實(shí)現(xiàn)。由于CIL能運(yùn)行在所有支持CLI的環(huán)境中,例如剛剛提到的.NET運(yùn)行時(shí)以及Mono運(yùn)行時(shí),也就是說和具體的平臺(tái)或者CPU無關(guān)。
一般對(duì)于unity開發(fā)的游戲來說,內(nèi)存的開銷都是圍繞下面的三個(gè)方面:
1.資源內(nèi)存的占用;
2.引擎模塊自身內(nèi)存占用;
3.托管堆內(nèi)存占用。
Mono通過垃圾回收機(jī)制(GarbageCollect,簡(jiǎn)稱GC)對(duì)內(nèi)存進(jìn)行管理,可以自動(dòng)地改變堆的大小來適應(yīng)你所需要的內(nèi)存,并且是可以適時(shí)地調(diào)用垃圾回收(GarbageCollection)操作來釋放已經(jīng)不需要的內(nèi)存。也就是說Mono會(huì)自動(dòng)釋放一些內(nèi)存,但要注意的是GC釋放的內(nèi)存只會(huì)留給mono使用,并不會(huì)交還給操作系統(tǒng),因此mono堆內(nèi)存是只增不減的。
這里簡(jiǎn)單介紹下Mono回收原理:
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ì)象的被標(biāo)記意味著該對(duì)象可以通過全局對(duì)象或者當(dāng)前上下文訪問到,而沒有被標(biāo)記的對(duì)象則意味著該對(duì)象無法通過任何途徑訪問到,即該對(duì)象“失聯(lián)”了,GC最終會(huì)將所有“失聯(lián)”的對(duì)象內(nèi)存進(jìn)行回收。
內(nèi)存泄露定義
我們把對(duì)象已經(jīng)不再需要使用卻沒有被GC回收的情況稱為mono內(nèi)存泄漏。Mono內(nèi)存泄漏會(huì)使空閑內(nèi)存減少,GC頻繁,mono堆不斷擴(kuò)充,最終導(dǎo)致游戲內(nèi)存占用的升高。最終導(dǎo)致內(nèi)存過高,進(jìn)程被操作系統(tǒng)Kill或者崩潰。簡(jiǎn)單來說,也就是一些對(duì)象被實(shí)例化出來后沒有被釋放掉,一種保存在內(nèi)存中,新的對(duì)象又需要申請(qǐng)新的內(nèi)存空間,導(dǎo)致內(nèi)存不斷上升。
重點(diǎn)關(guān)注點(diǎn)
配置文件的使用、紋理、網(wǎng)格、RenderTexture和粒子系統(tǒng);
比如頻繁的創(chuàng)建銷毀對(duì)象是否使用對(duì)象池,或者粒子,紋理等資源顯示過后是否被及時(shí)從內(nèi)存中釋放,等等;
三.測(cè)試手段
1.首先通跑測(cè)試,確定問題確定原因,比如我上面通過通跑游戲確定存在內(nèi)存泄露;
2.縮小范圍,由于一個(gè)游戲在運(yùn)行的過程中場(chǎng)景比較復(fù)雜,上面的同跑并不能準(zhǔn)確定位問題,所以我們要?jiǎng)澐謭?chǎng)景測(cè)試,例如我在上面的通跑游戲過程中包括以下場(chǎng)景,打開關(guān)閉UI界面,戰(zhàn)斗場(chǎng)景,切換地圖,升級(jí)武器等,如果沒有比較明顯的數(shù)據(jù),那就要分別針對(duì)以下場(chǎng)景進(jìn)行測(cè)試。比如UI場(chǎng)景可以反復(fù)打開關(guān)閉UI界面,戰(zhàn)斗場(chǎng)景可以持續(xù)戰(zhàn)斗掛機(jī),反復(fù)切換地圖等等,總之是把游戲內(nèi)進(jìn)行的行為減少,細(xì)化要檢測(cè)的場(chǎng)景;
3.定位問題
如果某個(gè)場(chǎng)景發(fā)生內(nèi)存泄露,邊定位到那個(gè)場(chǎng)景運(yùn)行游戲,而在游戲運(yùn)行時(shí),相應(yīng)的引擎也有一些工具可以查看具體的代碼使用情況,比如unity的Profiler。
如果多個(gè)場(chǎng)景都出現(xiàn)內(nèi)存泄露,那就要查找這些場(chǎng)景所交叉的部分,比如通信框架等;而本次經(jīng)過多個(gè)場(chǎng)景的測(cè)試發(fā)現(xiàn)都存在泄露,最后經(jīng)過排查發(fā)現(xiàn)是使用的通信框架存在泄露問題。
四,Perfdog內(nèi)存相關(guān)簡(jiǎn)介
通常情況下安卓可以輕松獲取到的內(nèi)存有4種數(shù)據(jù),我們也可以通過ADB來獲取,
VSS - Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
RSS - Resident Set Size 實(shí)際使用物理內(nèi)存(包含共享庫(kù)占用的內(nèi)存)
PSS - Proportional Set Size 實(shí)際使用的物理內(nèi)存(比例分配共享庫(kù)占用的內(nèi)存)
USS - Unique Set Size 進(jìn)程獨(dú)自占用的物理內(nèi)存(不包含共享庫(kù)占用的內(nèi)存)
一般來說內(nèi)存占用大小有如下規(guī)律:VSS >= RSS >= PSS >= USS
而Perfog的Memory也就是 Android PSS Memory,也是我們通常來用作代表內(nèi)存的數(shù)據(jù),是實(shí)際使用的物理內(nèi)存大小。
Swap Memory (Swap Memory,部分設(shè)備支持Swap功能,在啟用Swap功能后,系統(tǒng)會(huì)對(duì)PSS內(nèi)存進(jìn)行壓縮,Swap增加,PSS會(huì)相應(yīng)減少,由于壓縮會(huì)占用CPU資源,同時(shí)相應(yīng)會(huì)導(dǎo)致FPS降低)
Virtual Memory(VSS) 虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間),而實(shí)際上它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上,在需要時(shí)進(jìn)行數(shù)據(jù)交換。
五、Perfdog新功能初探
PerfDog 3.5版本剛剛推出,新增一個(gè)最新的數(shù)值,CPU Usage(Normalized):規(guī)范化CPU利用率
官方給出的解釋為:
傳統(tǒng)計(jì)算方法:當(dāng)前時(shí)刻CPU頻率下,CPU Usage = CPU執(zhí)行時(shí)間/CPU總時(shí)間。
由于移動(dòng)設(shè)備CPU頻率時(shí)刻變化,用傳統(tǒng)CPU利用率計(jì)算方法,假定在低頻率時(shí)刻計(jì)算出CPU利用率=30%,和在CPU高頻時(shí)刻計(jì)算出CPU利用率=30%。同樣都是30%但性能消耗是完全不樣的,明顯高頻消耗更高。傳統(tǒng)CPU利用率已無法真實(shí)反映性能消耗。
所以我們需要一種規(guī)范化(可量化)的統(tǒng)計(jì)方式。將頻率因素考慮進(jìn)去。
CPU Usage(Normalized)= (CPU執(zhí)行時(shí)間/CPU總時(shí)間) * (當(dāng)前時(shí)刻所有CPU頻率之和/所有CPU頻率大值之和)。
PerfDog兩種統(tǒng)計(jì)方式都有。CPU Usage默認(rèn)為規(guī)范化CPU利用率。建議使用規(guī)范化CPU利用率作為衡量性能指標(biāo)。
具體的描述可以看這里: 規(guī)范化CPU利用率
嘗鮮體驗(yàn)以下。測(cè)試使用過程和之前的一樣。來看看新增的數(shù)據(jù)對(duì)比
title:
CPU Usage趨勢(shì)圖對(duì)比:
CPU Core Usage趨勢(shì)圖對(duì)比:
從趨勢(shì)圖來看的話,實(shí)際上兩種算法并無太大差異,但是精確到具體幀的使用率,差異會(huì)比較明顯,單純從性能的角度來說,傳統(tǒng)CPU利用率僅能從數(shù)值的角度體現(xiàn)手機(jī)的CPU使用程度,但是無法從性能使用程度的角度表達(dá)手機(jī)的CPU使用效率,就像前文所說,低頻率時(shí)刻計(jì)算出CPU利用率=30%,和在CPU高頻時(shí)刻計(jì)算出CPU利用率=30%。同樣都是30%但性能消耗是完全不樣的。規(guī)范化CPU利用率數(shù)值可以彌補(bǔ)這一缺點(diǎn)。目前的測(cè)試行業(yè)良莠不齊,規(guī)范指標(biāo)較少,如果真的可以做到統(tǒng)一行業(yè)標(biāo)準(zhǔn)不失為一件好事。
網(wǎng)站標(biāo)題:Perfdog玩轉(zhuǎn)內(nèi)存泄漏-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://www.rwnh.cn/article8/cehsop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、商城網(wǎng)站、全網(wǎng)營(yíng)銷推廣、靜態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容