對(duì)于Unity內(nèi)存管理而言贸铜,需要理解托管堆聂受。對(duì)于如何分析托管內(nèi)存和如何優(yōu)化內(nèi)存蛋济,可以參見Unity優(yōu)化中的理解托管堆部分碗旅。
Assets 資產(chǎn)
Unity中的Assets在運(yùn)行過程中會(huì)對(duì)原生內(nèi)存和托管內(nèi)存造成影響镜悉。Unity運(yùn)行過程中是不會(huì)將托管的內(nèi)存交還給操作系統(tǒng)重新利用,只有等到應(yīng)用運(yùn)行結(jié)束才會(huì)釋放旧困。如果碎片化很嚴(yán)重稼锅,碎片化的內(nèi)存難以回收,托管的內(nèi)存堆會(huì)一直保持增長(zhǎng)直到消耗完所有的內(nèi)存馍悟。這個(gè)行為是很難預(yù)測(cè)的剩晴,所以了解Asset在內(nèi)存中的存放方式就非常重要了:
- 使用
Destroy(myObject)
來銷毀Object(對(duì)象)并且釋放對(duì)應(yīng)的內(nèi)存侵状。將某個(gè)Object的引用置成null并不會(huì)釋放內(nèi)存空間。 - 應(yīng)該把長(zhǎng)期存在的對(duì)象設(shè)成類绽左,短時(shí)間存在的對(duì)象設(shè)為結(jié)構(gòu)體艇潭。結(jié)構(gòu)體不會(huì)再內(nèi)存堆上分配所以不會(huì)引起垃圾回收蹋凝。
- 重用臨時(shí)緩沖區(qū)來保證臨時(shí)分配的內(nèi)存的需求,而不是頻繁分配內(nèi)存改含。
- 枚舉器(Enumerator)永遠(yuǎn)不會(huì)清除自己的內(nèi)存迄汛。
- 避免使用永遠(yuǎn)不會(huì)結(jié)束的協(xié)程(Coroutine)骤视,尤其是會(huì)在協(xié)程里面分配大量的托管內(nèi)存专酗,協(xié)程在運(yùn)行過程中會(huì)保持堆中的棧分配內(nèi)存笼裳,直到協(xié)程結(jié)束的時(shí)候才會(huì)釋放粱玲。
更詳細(xì)的參考資料最好去參閱上面提供的鏈接地址,會(huì)有更深入的理解允青。