關於物件池的介紹和講解網上有很多,這裡就不進行贅述。考慮到外掛程式以後可能會進行修改或擴充套件,所以我需要使用泛型,然後初步確定物件池需要有取出、**和清空三個功能。所以**如下:
public
class
objectpool
where t :
class
///
/// 從池子中獲取物件
///
///
public
tgetobject()
///
/// 將物件**進池子
///
///
public
void
recycleobject()
///
/// 清空池子
///
public
void
clearpool()
}
其中考慮到不同型別的物件可能例項化或者消失顯示的方式不同,所以建立了乙個poolitembase類作為池子的儲存物件,這個類也是泛型,裡面主要有例項化、隱藏、銷毀和顯示的方法,池子只需要呼叫物件的相應方法即可;此外在構造的時候需要有乙個prefeb引數作為模板,建立了乙個泛型的prefebobj變數進行儲存,以後池子建立出來的元素全部以此為模板(總感覺這個變數的存在不太好,但是想來想去想不到應該怎麼去掉,這裡先備註想到好辦法在進行修改)。
public
abstract
class
poolitembase
where t :
class
此基類的使用也很簡單,只需要在繼承的時候通過構建函式為prefebobj變數賦值,然後重寫裡面的方法就好了。放出測試的**讓大家看一下
public
class
gameobjectpoolitem
:poolitembase
public
override
void
destoryitem
(gameobject obj)
public
override
gameobject
installnewitem()
public
override
void
outpoolevent
(gameobject t)
public
override
void
unactiveitem
(gameobject obj)
}
至此,只需要在池子的函式中填充對應的邏輯就完成啦!完整**如下:在測試的時候發現池子每次在**的時候需要從管理的列表中拿出乙個元素,然後再需要手動將該元素從管理列表中刪除好麻煩,所以在**的方法中新增了乙個list變數,再通過ref關鍵字返回,這樣在**的時候只需要將物件列表傳進去池子就可以自動**並修改列表,操作簡單了許多。
public
class
objectpool
where t :
class
///
/// 從池子中獲取物件
///
///
public
tgetobject()
else
_itemprefeb.
outpoolevent
(t);
return t;
}///
/// 將物件**進池子
///
///
public
void
recycleobject
(ref list tlist)
}///
/// 清空池子
///
public
void
clearpool()
}}
測試一下,效果完美。
乙個簡單的物件池
在伺服器的的執行過程中,由於大量的計算會導致某些物件頻繁地分配和釋放,久而久之就會產生大量的記憶體碎片,從而影響伺服器的效率和穩定。本文通過實現乙個輕量級的物件池重用物件來解決這個問題。include include mutex.h define min increasize 30 每次最少分配30...
乙個簡單的物件池
從書上直接摘抄下來的物件池,以後別給忘了 template class objectpool template objectpool objectpool int chunksize throw std invalid argument,std bad alloc mchunksize chunks...
物件池的使用
1 乙個模板類的物件池,template class objpool objpool void bool init int nmaxcount 10 t newobj void 取得pos的物件 同時在obj中記錄在pool中的index pool unlock return pobj void d...