Unity 遊戲物件池ObjectPool

2021-10-25 22:32:47 字數 4052 閱讀 8662

遊戲引擎: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中的運用 物件池,通常用於在那些需要經常建立又銷毀的物件 比如我們場景中的小怪,經常需要建立和銷毀,我們就可以在小怪銷毀的時候,不真正的銷毀而是,而是把它放入物件池中 等到下一次我們需要建立小怪的時候,再從物件池中取出來 由於物件池的物件沒有真正銷毀,而手機的記憶體又是如...