遊戲引擎:unity
版本:2019.4.6f1 【2017版本以上均可】
編譯平台:visual studio 2019
在開發過程中,很多時候會出現針對某一gameobject的頻繁建立與銷毀這類問題,從效能上認為這種行為是極度損耗的,為避免對效能的不必要損耗,出現遊戲物件池的優化解決方案。
unity中gameobject的建立與銷毀,分別依賴於cpu與記憶體,對於頻繁建立和銷毀gameobject的行為是十分消耗cpu的效能。為避免cpu不必要的效能開支(負荷),出現以記憶體為主要物件,預先準備相當的gameobject數量儲存於記憶體中,僅通過cpu啟用/禁用這類gameobject物件來減輕cpu的工作負荷。
簡言:放棄單獨的分配和釋放物件,從固定的池中重用物件,以實現節約記憶體使用率和提供效能。
物件池適用的物件為頻繁建立的遊戲物件,物件池需要經過[建立-**]過程。
using system.collections;
using system.collections.generic;
using unityengine;
namespace tool
//1.池
private dictionary<
string
, list
> cache;
protected
override
void
init()
//2.建立
public
gameobject
createobject
(string type,
gameobject prefab,
vector3 position,
quaternion rotation)
else
//(2)如果沒有則建立並加入到物件池中
if(targetobject ==
null
)//(3)設定位置,使用物件
targetobject.transform.position = position;
targetobject.transform.rotation = rotation;
targetobject.
setactive
(true);
//foreach
(var item in targetobject.
getcomponents
<
iresetable
>()
)return targetobject;
}//3.**
private
void
collectobject
(gameobject targetobject)
private
ienumerator
delaycollectobject
(gameobject targetobject,
float delaytime)
///
/// **[封裝]
///
/// 遊戲物件
/// 延遲時間
public
void
collectobject
(gameobject targetobject,
float delaytime =0f)
else}}
}
2.1 建立物件池
物件池是儲存prefab[預製件],建立物體物件,需要獲取[物件名稱]、[物件預製件]、[物件座標]、[物件自身角度]資訊。建立物件的過程中需要檢查場景中是否存在這個物件,有則使用,無則建立新的使用。
///
/// 建立
///
/// type:物品型別 prefab:物體預製件 position:物體出現位置 rotation:物體出現方向
public
gameobject
createobject
(string type,
gameobject prefab,
vector3 position,
quaternion rotation)
//(1)查詢可使用的遊戲物件
gameobject targetobject =
null
;// 檢查是否包含物件
if(cache.
containskey
(type)
) targetobject = cache[type]
.find
(e =
>
!e.activeinhierarchy)
;else
cache.
add(type,
newlist
<
gameobject
>()
);//(2)如果沒有則建立並加入到物件池中
if(targetobject ==
null
)//(3)設定位置,使用物件
targetobject.transform.position = position;
targetobject.transform.rotation = rotation;
targetobject.
setactive
(true);
//foreach
(var item in targetobject.
getcomponents
<
iresetable
>()
)return targetobject;
}
2.2 **物件
2.2.1 **方法
**方式採用的是禁用物體,而非銷毀物體,讓物體持續存在於記憶體當中。unity本身提供了禁用方法,即[setactive(bool isactive)]。如下所示,填入[false]表示這個gameobject物件被禁用,而非銷毀。
//3.**
private
void
collectobject
(gameobject targetobject)
2.2.2 **需求拓展:延時**
隨著需求的變更,我們不僅僅是希望立刻禁用,也出現延時禁用的實際需求,在unity中的命名空間[unityengine]為我們提供了協程[ienumerator]這一便捷的幫助,如圖所示:
private
ienumerator
delaycollectobject
(gameobject targetobject,
float delaytime)
2.2.3 **需求的封裝【支援立即**與延時**】
隨著需求的增多,**的方法種類也隨之增多,在使用這些**方法的過程中,因為過多的命名或呼叫方法而迷糊不清各**方法的差異點。所以我們封裝**的方法,僅通過乙個呼叫方法,多層過載來簡明呼叫,而不是同型別的方法群中乙個個查詢呼叫。
///
/// **[封裝]
///
/// 遊戲物件
/// 延遲時間
public
void
collectobject
(gameobject targetobject,
float delaytime =0f)
else
}
Unity基礎 物件池
物件池是一種通過空間來換取時間的思想 佔記憶體,時間消耗少 適用性 頻繁建立 銷毀遊戲物件 字典 型別,物件 資料結構 dictionary 核心成員 1.通過物件池建立物件 2.物件 using system.collections using system.collections.generic...
Unity 資源池,物件池,Object Poor
將一定數量的物件預先儲存在資源池中,當需要的時候使用,不用的時候再放回。這樣節約了很多效能,不必每次都去生成然後再銷毀。資源池常有的引數 資源的種類,資源的初始數量,資源的最大數量。假如我們在遊戲中需要不停的使用幾種特效,然後銷毀該特效 或者不停的生成乙個物體 子彈等 然後再去銷毀這個物體。頻繁使用...
unity中物件池運用
最近在研究物件池在unity中的運用 物件池,通常用於在那些需要經常建立又銷毀的物件 比如我們場景中的小怪,經常需要建立和銷毀,我們就可以在小怪銷毀的時候,不真正的銷毀而是,而是把它放入物件池中 等到下一次我們需要建立小怪的時候,再從物件池中取出來 由於物件池的物件沒有真正銷毀,而手機的記憶體又是如...