Unity內(nèi)存

1盯串、Unity內(nèi)存按照分配方式分為:

(1)Native Memory(本地內(nèi)存)

(2)Managed Memory(托管內(nèi)存)

Editor和Runtime內(nèi)存管理是不同的,Editor下打開(kāi)工程就會(huì)將所有資源加載進(jìn)內(nèi)存,而Runtime是我們調(diào)用相應(yīng)的Load接口時(shí)才會(huì)加載進(jìn)內(nèi)存桥嗤。

2咨堤、Unity按照管理者分為:

(1)引擎管理內(nèi)存

(2)用戶管理內(nèi)存

3、Unity Native Memory管理

圖3-1 Native-Memory分配流程

Unity通過(guò)重載C++的new/malloc內(nèi)存分配操作符實(shí)現(xiàn)自己的內(nèi)存管理顿涣。

3.1? Allocator與memory label

memory label區(qū)分內(nèi)存類(lèi)型波闹,每一種內(nèi)存類(lèi)型都會(huì)對(duì)應(yīng)一個(gè)Allocator,每個(gè)Allocator有各自的分配策略,每一個(gè)Allocator會(huì)跟蹤一個(gè)內(nèi)存池涛碑。當(dāng)需要申請(qǐng)內(nèi)存時(shí)精堕,就會(huì)找到對(duì)應(yīng)類(lèi)型的Allocator進(jìn)行分配。

3.2? NewAsRoot

調(diào)用NewAsRoot時(shí)會(huì)分配所有

3.3 Stack Allocator

Stack Allocator用于分配局部?jī)?nèi)存蒲障,Stack Allocator的特點(diǎn)就是快歹篓、小、臨時(shí)揉阎。

當(dāng)Stack Allocator分配內(nèi)存時(shí)庄撮,一次分配一個(gè)大的Heap Block塊,然后通過(guò)棧的方式管理這塊Block的分配毙籽。實(shí)際分配內(nèi)存時(shí)會(huì)包含一個(gè)Header和User Data洞斯,Header記錄當(dāng)前使用狀態(tài)、User Data大小等信息坑赡。使用一個(gè)棧頂指針管理內(nèi)存分配巡扇,每次分配只在棧頂頂端新分配一塊內(nèi)存,然后修改棧頂指針垮衷√瑁回收時(shí)如果回收的是非棧頂內(nèi)存只需要修改Header中使用狀態(tài)為Deleted;如果回收的是棧頂指針指向的內(nèi)存搀突,修改標(biāo)記狀態(tài)同時(shí)刀闷,棧頂指針向上回彈,回彈后會(huì)查看當(dāng)前指向的內(nèi)存是否已標(biāo)記為Deleted,如果是則繼續(xù)回彈仰迁,直到棧頂指針指向一個(gè)未標(biāo)記為Deleted的內(nèi)存甸昏。

圖3-2 Stack-Allocator示意圖

當(dāng)一個(gè)Block塊無(wú)法分配后,會(huì)再申請(qǐng)一塊Block徐许。但不可能無(wú)限分配施蜜,Stack Allocator有大小限制;

Editor:16MB Main Thread,256KB workers雌隅;Runtime:1MB Main thread翻默,64KB workers

如果我們需求內(nèi)存過(guò)大導(dǎo)致Stack Allocator大小不夠缸沃,Unity會(huì)執(zhí)行Fallback機(jī)制,會(huì)使用Dynamic Heap Allocator分配內(nèi)存修械。Dynamic Heap Allocator分配策略相對(duì)Stack Allocator復(fù)雜很多趾牧,所以耗時(shí)比較大,出現(xiàn)這種情況可能導(dǎo)致卡頓肯污。出現(xiàn)這種情況時(shí)Unity會(huì)給出一個(gè)MemoryManager.FallbackAllocation的提示翘单。所以可以分幀加載一個(gè)比較大或多的資源。

3.4 影響Native內(nèi)存大小因素

(1)Scene:場(chǎng)景中GameObject越多占用內(nèi)存越大

(2)Audio

a蹦渣、DSP Buffer Size(PlayerSettings->Audio)

聲音數(shù)據(jù)緩沖哄芜,太大可能導(dǎo)致聲音延時(shí),太小導(dǎo)致發(fā)送給CPU太頻繁

b柬唯、Force to mono:強(qiáng)制改成單聲道忠烛,內(nèi)存相對(duì)雙聲道減半

c、Format

d权逗、Compression Format

(3)Code Size

模板泛型濫用

(4)AssetBundle

a美尸、TypeTree:保證不同版本序列化正確

如果確保Bundle版本和Unity版本一致,打Bundle時(shí)可以通過(guò)設(shè)置BuildAssetBundleOptions.DisableWriteTypeTree關(guān)閉TypeTree斟薇,減小包體师坎、省內(nèi)存、并且可以提升打包速度堪滨。

b胯陋、LZ4(trunk based)/LZMA

c、設(shè)置合適的AB大小和數(shù)量

(5)Resources文件夾

打包時(shí)會(huì)生成R-B Tree用于Resources檢索

(6)Texture

a袱箱、upload buffer(Project Settings->Quality->Async Upload Buffer Size)

b遏乔、read/write

c、Mip Maps

(5)Mesh

a发笔、read/write

b盟萨、compression

(6)Assets

4、Unity Managed Memory

圖4-1 Managed Memory分配機(jī)制

4.1?

Unity使用Boehm回收器了讨,Boehm是保守式回收器捻激。

由于分代式垃圾回收移動(dòng)內(nèi)存、壓縮等開(kāi)銷(xiāo)較大前计,不適合移動(dòng)平臺(tái)胞谭,所以Unity選擇使用Boehm回收。

Unity不論使用Mono還是IL2CPP都使用Boehm回收器男杈,

Unity嵌入早期版本的Mono(具體原理可參考Mono自動(dòng)內(nèi)存管理分析)丈屹,采用非分代、非壓縮的保守式GC伶棒,托管內(nèi)存只增不減旺垒。

IL2CPP由Unity自己重寫(xiě)垃圾回收機(jī)制彩库,是升級(jí)版的Boehm。使用IL2CPP袖牙,托管內(nèi)存可以降低,內(nèi)存返還的條件就是當(dāng)GC6次舅锄,某一個(gè)Block都是閑置時(shí)鞭达,就會(huì)將這個(gè)Block返還給系統(tǒng)。

圖4-2 回收機(jī)制展示

4.2 Managed Memory最佳實(shí)踐

(1)使用Destroy皇忿,別用Null畴蹭;

(2)Class VS Struct;

(3)緩存池鳍烁;

(4)Closures and anonymous methods(閉包和匿名函數(shù))叨襟;

(5)Coroutines(協(xié)程);

(6)Configuration(配置表)幔荒;

(7)Singleton

(8)先分配大內(nèi)存再分配小內(nèi)存減少碎片化

4.3?Incremental GC

Unity2019.1引入Incremental GC(漸進(jìn)式GC)糊闽,在使用Boehm回收器的基礎(chǔ)上以增量模式運(yùn)行,將垃圾收集拆分到多幀進(jìn)行爹梁。

大多數(shù)情況下右犹,Incremental GC可以減少垃圾收集尖峰問(wèn)題。但某些情況下姚垃,使用Incremental GC可能會(huì)產(chǎn)生其它問(wèn)題:

(1)Incremental GC是拆分的標(biāo)記階段念链,當(dāng)對(duì)象引用改變時(shí),必須在下一次迭代中再次掃描這些對(duì)象积糯,如果在標(biāo)記階段不斷有引用關(guān)系的變化掂墓,可能導(dǎo)致標(biāo)記遍歷永遠(yuǎn)不能完成,這種情況下看成,垃圾收集會(huì)退回到進(jìn)行完整的非增量收集君编。

(2)另外,Incremental GC時(shí)川慌,引用發(fā)生改變啦粹,Unity就需要設(shè)置寫(xiě)屏障通知垃圾收集,會(huì)增加開(kāi)銷(xiāo)窘游,對(duì)代碼產(chǎn)生性能影響唠椭。

5、Native和Managed關(guān)系

圖5-1 Native和Manager Object關(guān)系(視頻地址:https://www.bilibili.com/video/BV1J64y187TW?p=3)

如圖5-1忍饰,上半部分是Native Object創(chuàng)建過(guò)程贪嫂,下半部分是Managed Object創(chuàng)建過(guò)程。實(shí)際上不論我們是創(chuàng)建一個(gè)native object還是managed object都可能同時(shí)創(chuàng)建一個(gè)關(guān)聯(lián)的managed/native object艾蓝。

比如加載一個(gè)Texture會(huì)創(chuàng)建一個(gè)native object實(shí)例力崇,同時(shí)也會(huì)創(chuàng)建一個(gè)托管的Texture實(shí)例斗塘。

Texture _texture = Resources.Load<Texture>("Unity");

我們將_texture置為null,然后調(diào)用GC.Collect()亮靴;此時(shí)在Profiler中查看_texture實(shí)例并沒(méi)有被回收馍盟,而當(dāng)我們調(diào)用Resources.UnloadUnusedAssets()后_texture銷(xiāo)毀了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茧吊,一起剝皮案震驚了整個(gè)濱河市贞岭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搓侄,老刑警劉巖瞄桨,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異讶踪,居然都是意外死亡芯侥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)乳讥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柱查,“玉大人,你說(shuō)我怎么就攤上這事云石∥锔希” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵留晚,是天一觀的道長(zhǎng)酵紫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)错维,這世上最難降的妖魔是什么奖地? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮赋焕,結(jié)果婚禮上参歹,老公的妹妹穿的比我還像新娘。我一直安慰自己隆判,他們只是感情好犬庇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著侨嘀,像睡著了一般臭挽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咬腕,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天欢峰,我揣著相機(jī)與錄音,去河邊找鬼。 笑死纽帖,一個(gè)胖子當(dāng)著我的面吹牛宠漩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播懊直,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扒吁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了室囊?” 一聲冷哼從身側(cè)響起雕崩,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎波俄,沒(méi)想到半個(gè)月后晨逝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛾默,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懦铺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了支鸡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬念。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牧挣,靈堂內(nèi)的尸體忽然破棺而出急前,到底是詐尸還是另有隱情,我是刑警寧澤瀑构,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布裆针,位于F島的核電站,受9級(jí)特大地震影響寺晌,放射性物質(zhì)發(fā)生泄漏世吨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一呻征、第九天 我趴在偏房一處隱蔽的房頂上張望耘婚。 院中可真熱鬧,春花似錦陆赋、人聲如沸沐祷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赖临。三九已至,卻和暖如春灾锯,著一層夾襖步出監(jiān)牢的瞬間思杯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留色乾,地道東北人誊册。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暖璧,于是被迫代替她去往敵國(guó)和親案怯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自: https://www.notion.so/Unity-f79bb1d4ccfc483fbd8f8eb85...
    魁犸閱讀 1,489評(píng)論 0 3
  • 本文首發(fā)公眾號(hào)洪流學(xué)堂澎办。洪流學(xué)堂嘲碱,讓你快人幾步。 本文主要是Unity官方川哥的視頻《淺談Unity內(nèi)存管理》的筆...
    洪智閱讀 3,952評(píng)論 0 11
  • 作者:Arthuryu局蚀,騰訊高級(jí)開(kāi)發(fā)工程師著作權(quán)歸作者所有麦锯。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系騰訊WeTest獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注...
    飯盒閱讀 4,523評(píng)論 1 39
  • https://draveness.me/golang/[https://draveness.me/golang/...
    shuff1e閱讀 506評(píng)論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者琅绅,不喜歡去冒險(xiǎn)扶欣,但是人生放棄了冒險(xiǎn),也就放棄了無(wú)數(shù)的可能千扶。 ...
    yichen大刀閱讀 6,049評(píng)論 0 4