熟悉c# gc的同學都知道,每次建立引用型別變數都會對記憶體中引用的引用型別產生一次強引用,如果一直保持有引用,就會造成該引用型別不能被釋放掉,但很多時候我們已經不需要使用該變數,所以需要時時檢查變數的引用。
之前在解決fmod音效資源不能被有效釋放時候就使用了弱引用記憶體池的技術。用乙個弱引用池來儲存物件,防止長期不用而沒有釋放掉。**如下:
///
/// 乙個弱引用的記憶體池。不會造成記憶體洩漏。用於加速2次讀取速度
///
///
public
class
cachepool
where t:
class
private
bool mweakref;
//是否弱引用,弱引用用mcache弱引用字典,否則用普通字典mcache2
private dictionary<
string
, weakreference
> mcache =
newdictionary
<
string
, weakreference
>()
;private dictionary<
string
, t> mcache2 =
newdictionary
<
string,t
>()
;public
tget
(string name)
if(mcache.
trygetvalue
(name,
outvar val)
)return
null;}
public
bool
update
(string name,
t val)
if(mcache.
trygetvalue
(name,
outvar refer)
)else
return
true;}
public
void
clear()
}
但這樣還不夠,我們還需要控制管理物件的生命週期,用乙個鍊錶型別的資料結構儲存強引用,每隔一段時間檢查裡面的物件,有超過一段時間沒使用的物件則刪除該物件,解除該對該物件的強引用,這樣該物件只剩弱引用,就會在下一次gc時候釋放掉。
public
class
objectlifecycle
public
float
getupdatelife()
}public
class
cachepoollifecycle
where t : objectlifecycle
if( time.time - mlastupdatetime <60)
// 每60秒檢查
return
; mlastupdatetime = time.time;
var deltime = time.time -60*
2;// 2分鐘沒使用過的**
var node = mcache.first;
while
( node != mcache.last )}}
public
void
put(
t obj)
}
Unity記憶體優化 物件池
為什麼用物件池?作用 因為mono內存在unity中不能手動釋放,當其記憶體超過上限時,會先觸發gc釋放沒有用到的記憶體空間,如果還不夠則會擴充。其容量一旦被撐大,專案所佔的記憶體就會跟著增大。使用物件池可以減少物件建立,緩解記憶體壓力。物件池示意 這裡通過乙個棧儲存物件 m maxcount 表示...
unity資源管理 記憶體池
記憶體池思想 建立物件時,先檢查記憶體池中是否有快取物件,如果沒有再建立新的。刪除物件時,不立即銷毀,快取一段時間,避免重複建立,提公升執行效率,用空間換時間的做法。常用怪 npc 技能特效 血條等。基本功能 儲存,獲取,智慧型刪除。實現方式 基本物件 public class poolitem p...
iOS 弱引用weak的使用
oc開發過程中,我們經常會使用到弱引用和強引用 我們為什麼要使用弱引用呢?要想知道這個我們需要weak的原理。原理 runtime維護了乙個weak表,其實weak是乙個hash 雜湊 表,其中key表示指向物件的指標,value是乙個陣列,裡面儲存的weak指標的位址陣列,當我們使用 weak的時...