前面一文基於addressable的資源載入更新記錄了資源的載入,本文將緊貼資源的載入,結合設計模式中的享元模式的理念設計物件快取池,避免在遊戲過程中頻繁的進行建立和銷毀的工作。
在基於addressable的資源載入更新一文中有提到快取池的結構,主要分為以下幾大模組:
private
class
cachelist
}///
/// 可以使用的快取物件的數量
///
public
int cachescount
}///
/// 新增使用項
///
///
public
void
addreference
(t t)
}///
/// 從快取池中取出乙個項使用
///
///
public
tpop()
else
cachelist's caches is empty but use pop"
, prefab.name));
}}///
/// 使用完成之後放回快取池
///
///
public
void
push
(t t)
public
void
delete
(t t)
///
/// 使用計算
///
internal
void
initinfomation()
public
void
clearcaches
(dictionary
lookup)
foreach
(var
obj in
this
.references)
this
.caches.
clear()
;this
.references.
clear()
; prefab =
null;if
(isaddressableassets)
addressablemanager.instance.
unloadasset
(address);}
///
/// 清理多餘的快取資源
///
///
public
list
cleancache()
return list;
}return
null;}
}
為方便不同的資源型別復用快取池的邏輯,這裡將採用泛型來實現快取的邏輯,將cachelist類設計為addressablepool的嵌入類型別。addressablepool負責判斷載入邏輯是使用快取池的物件還是重新建立新的物件。
public
void
addtemplate
(string
address,
unityengine.object obj,
bool
isaddressabel=
true
,float
exceed = addressablemanager.exceed)
else
}
在介面上直接傳入模板(gameobject),也能使用這個快取池的方法(在飄提示文字的時候經常用到),如果是需要載入,則在載入完成之後也呼叫該方法,只需要用個標記來區分是載入的模板還是外部直接傳入的模板(資源清理時,載入的模板需要呼叫釋放介面。介面上直接傳入的則不用)。
public
void
loadasset
(string
address,
system.action
oncomplete,
float
exceed = assetpoolmanager.exceed)
else
}else
else}}
else
loadcallback.
remove
(address);}
,()=>);
}}}
private
void
cleancache()
}}list<
string
>
deletelist =
newlist<
string
>()
;foreach
(var
info in
this
.pools)
}foreach
(var
info in deletelist)
}
Unity 優化快取池
1.給放入快取池的gameovject設定父節點 using system.collections using system.collections.generic using unityengine 快取池模組 1.dictionary list 2.gameobject和resources 兩個...
Unity 通用 物件池管理
一般情況下我們使用物件池是物體的建立和管理。但在很多情況下需要批量建立的物體需要做一些邏輯處理,這樣我們需要記錄物件池對應的資料狀態。所以我們就直接把物件作為管理物件,這樣我們可以在物件裡面做一些邏輯處理還能便於物體管理。作為物件管理類,那麼我們必須要乙個同乙個父類作為管理的類別。在父類裡面包含一些...
Unity搭建簡易UI框架之美
在unity專案開發中,ui模組的開發往往佔據了很大一部分工作,部分遊戲甚至絕大部分的工作都是在ui上,如何高效管理各種介面,下面就給大家分享一套高效易用的ui框架。首先,我們定義乙個panelbase類,作為所有panel的父類,在這個類裡,我們可以給panel定義一套生命週期 初始化 publi...