為什麼用物件池?
作用:因為mono內存在unity中不能手動釋放,當其記憶體超過上限時,會先觸發gc釋放沒有用到的記憶體空間,如果還不夠則會擴充。其容量一旦被撐大,專案所佔的記憶體就會跟著增大。使用物件池可以減少物件建立,緩解記憶體壓力。
物件池示意 這裡通過乙個棧儲存物件
m_maxcount 表示最大儲存個數
m_norecyclenum 用來記錄未歸還的物件
public
class
classobjectpool
where t :
class
,new()
}///
/// 從池中取物件
///
/// 如果池是空的則建立
///
public
tspawn
(bool create_if_pool_empty =
true)}
if(res !=
null
) m_norecyclenum++
;return res;
}else
}return
null;}
///
/// 把物件放回池中
///
/// 還回物件
///
public
bool
recycle
(t obj)
methodinfo[
] methods = obj.
gettype()
.getmethods()
;foreach
(methodinfo info in methods));
}}m_pool.
push
(obj)
;return
true;}
}
將物件歸還到物件池,如果物件的資訊需要重置,則需要重置再歸還。可以在物件中新增重置方法,我這裡在歸還的時候使用反射呼叫
public
class
assetbundleitem
以上是物件池的基礎**,但是這樣還是可以 new 出多個相同型別的 classobjectpool,所以我採用乙個字典,將已建立的物件池快取起來統一管理
//快取objectmanager建立的物件池
protected dictionaryobject
> obj_dic =
newdictionary
<
type
,object
>()
;//獲得或者建立乙個物件池
//當有物件池的時候則直接取,沒有的時候按count的數量建立
public classobjectpool
getorcreteobject
<
t>
(int count =1)
where t :
class
,new()
return out_obj as classobjectpool
;}
Unity 優化快取池
1.給放入快取池的gameovject設定父節點 using system.collections using system.collections.generic using unityengine 快取池模組 1.dictionary list 2.gameobject和resources 兩個...
Unity記憶體優化
一 大概標準 1.紋理 40m 2.mono 30m 3.animation 20m 4.mesh 10m 6.font 10m 7.audio 5m 8.gfxdriver 25m 9.resourcemanager 視情況而定 跟 你resourcemanager裡放了多少檔案 該標準是我做 m...
Unity基礎 物件池
物件池是一種通過空間來換取時間的思想 佔記憶體,時間消耗少 適用性 頻繁建立 銷毀遊戲物件 字典 型別,物件 資料結構 dictionary 核心成員 1.通過物件池建立物件 2.物件 using system.collections using system.collections.generic...