![]()
這是第475篇UWA技術(shù)知識分享的推送,精選了UWA社區(qū)、UWA AI問答的熱門話題等技術(shù)知識點,助力大家更全面地掌握和學(xué)習(xí)。
UWA社區(qū)主頁:community.uwa4d.com
UWA QQ群:793972859
本期目錄:
持續(xù)性字符串拼接:每幀5KB從何而來?
碎片占比超50%:Mono內(nèi)存碎片化怎么避免?
本次推送的實戰(zhàn)案例來自于使用UWA服務(wù)的項目的真實且典型的問題。UWA將關(guān)鍵線索、定位路徑與處理建議整理成了可復(fù)用的案例筆記,便于大家快速對照、排查自身項目中的同類問題。
實戰(zhàn)案例
Q:GOT Online Mono模式報告顯示,我們項目Mono堆內(nèi)存中存在持續(xù)的字符串拼接現(xiàn)象,這是什么原因?qū)е碌模撛趺炊ㄎ缓蛢?yōu)化?
A:看到在UIPanel.LateUpdate中全程出現(xiàn)持續(xù)的String.Concat的分配,出現(xiàn)這種現(xiàn)象常見的原因包括:UI元素的name賦值;Panel取名等邏輯里存在字符串拼接;業(yè)務(wù)打點日志中頻繁做字符串拼接;Shader查找流程中存在名稱拼接操作等。優(yōu)化原則是避免每幀進行字符串拼接操作,將拼接結(jié)果緩存復(fù)用,減少Mono堆內(nèi)存臨時分配,字符串拼接邏輯本身也不應(yīng)放在游戲核心循環(huán)的熱路徑中。
![]()
從當(dāng)前報告數(shù)據(jù)來看,僅僅是 持續(xù)字符串拼接每幀新增約5KB臨時垃圾分配,再加上NGUI中一些其它分配,累計每萬幀分配量超90MB。UWA推薦Mono報告中Top10函數(shù)平均每10k幀分配堆內(nèi)存總和小于50MB,目前僅一個UIPanel.LateUpdate就已超出推薦值范圍,因此要對以UIPanel.LateUpdate為首的多個分配較高的函數(shù)進行排查。
![]()
排查方法是在Mono模式報告中,按"分配視角"查看函數(shù)堆棧,定位累積分配最多的葉子函數(shù),追溯其調(diào)用路徑。另外還可以利用報告里的倒序調(diào)用分析模塊,它能直接定位高分配的底層問題函數(shù),幫我們省去逐層排查的繁瑣操作,例如上述的String.Concat問題就能直接定位到。
![]()
Q:另外我們還在報告中發(fā)現(xiàn)Mono堆內(nèi)存出現(xiàn)了一個52MB的大數(shù)組,但查不到具體來源,該怎么排查?
![]()
A:我們可以從這份Mono模式報告看到,這個byte數(shù)組從測試開始就存在,但無法獲取其分配堆棧。這是因為在 UWA性能采集啟動前( 游戲初始化階段 ), 該數(shù)組就已經(jīng)完成分配了,所以追蹤不到來源。
需要我們采集數(shù)據(jù)的時候,在SDK面板上點擊Direct Mode進行采集。點擊Direct Mode后會在開始采集時殺掉進程并重新啟動游戲,從游戲啟動開始,Mono分配的整個生命周期就會被采集,這樣就可以追蹤到之前無法獲取堆棧的大數(shù)組來源了。
這類大數(shù)組常見來源多為大型配置表、場景標(biāo)記數(shù)據(jù)等。
若確認(rèn)是配置表導(dǎo)致,可優(yōu)化兩點:
將配置表數(shù)據(jù)下沉至Native層存儲,不占用Mono堆內(nèi)存,規(guī)避GC壓力與回收耗時;
改用更緊湊的數(shù)據(jù)結(jié)構(gòu),例如用bit替代int存儲標(biāo)記信息,進一步縮減內(nèi)存占用。
實戰(zhàn)案例
Q:Mono內(nèi)存碎片化比較嚴(yán)重,怎么避免,有什么優(yōu)化建議?
![]()
A:從報告來看,碎片占比高達112MB/219MB(約51%),在堆內(nèi)存分配釋放較為頻繁的項目中,UWA也常觀察到對象實際占用的部分和碎片會逐漸趨于相等。 Unity的Boehm GC為非壓縮回收器,不會主動整理Mono堆碎片,頻繁產(chǎn)生臨時內(nèi)存分配,是造成碎片化的主要原因; 即便GC回收空閑內(nèi)存,已形成的碎片也無法合并成連續(xù)大塊,只能被小對象復(fù)用,因此要盡量減緩碎片占比逐漸上升的趨勢。
我們可以從以下三個方面進行優(yōu)化:
第一,減少臨時分配,避免在熱路徑上進行字符串拼接、容器擴容等操作;
第二,對頻繁創(chuàng)建銷毀的對象使用對象池復(fù)用;
第三,對可預(yù)期的容器預(yù)分配足夠容量,避免運行時擴容。
無論是社區(qū)里開發(fā)者們的互助討論,還是AI基于知識沉淀的快速反饋,核心都是為了讓每一個技術(shù)難題都有解、每一次踩坑都有回響。希望這些從真實開發(fā)場景中提煉的經(jīng)驗,能直接幫你解決當(dāng)下的技術(shù)卡點,也讓你在遇到同類問題時,能更高效地找到破局方向。
封面圖來源于網(wǎng)絡(luò)
今天的分享就到這里。生有涯而知無涯,在漫漫的開發(fā)周期中,我們遇到的問題只是冰山一角,UWA社區(qū)愿伴你同行,一起探索分享。歡迎更多的開發(fā)者加入UWA社區(qū)。
UWA官網(wǎng):www.uwa4d.com
UWA社區(qū):community.uwa4d.com
UWA學(xué)堂:edu.uwa4d.com
點擊下方名片關(guān)注我們,將我設(shè)為星標(biāo),及時接收小編每日推送哦,性能優(yōu)化不迷路~
近期精彩回顧
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.