遊戲中的對象緩存池

   在遊戲編程時,每個關卡都要創建大量的對象,例如NPC,樹,草,地形等,而有些對象需要有遊戲中實時創建,比如爆炸效果,子彈。給遊戲對象分配內存本來就是比較耗費時間的,如果採用傳統的new 和delete的話,可能會使得遊戲的實時性降低。因此可以採用對象池的方法。即先根據關卡估計會用到對象數量,在關卡開始時先分配好需要的對象數量緩存起來,以後直接使用這些緩存的對象就OK了,當遊戲關卡結束時,清除對象池。

    本文采用了模版方法,參照了《面向對象遊戲開發--julian Gold》第七章的內容。對於一種對象的緩存池類來說,它在程序中只應該有一個對象。因爲爲一種對象創建兩個或多個緩存池根本就沒有必要,反而會增加代碼的複雜度。因此我採用了單件模式。

    那麼怎樣將對象緩存起來呢,我們只需要爲每個類重載操作符 new 和 delete 即可,當用戶new 一個對象時,我們從緩存池裏拿出一個事先分配好的對象,返回給用戶即可。當用戶調用 delete時,我們將請求刪除的對象放入緩存池,方便下次用戶調用new時使用。

 

內存池代碼如下:

 

 

測試程序:請注意debug模式與release模式的區別(Release模式下比較快)

 

 

 

測試結果:

在我的電腦上當輸入測試數量爲100000時

採用內存池分配的對象用時70

未採用內存池根本的對象用時565

以上測試在Release模式下完成,因爲在debug模式下,我採用了一些算法,確保分配不會出錯。所以效率很低

發佈了33 篇原創文章 · 獲贊 21 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章