遊戲記憶體管理 初探(上)

2021-05-22 12:05:49 字數 1939 閱讀 6043

遊戲中的記憶體管理,也可以叫做記憶體池,好像有些也叫物件池,其實方法不少。我就講哈我自己做的點點經驗和想法。

對應不同的類,使用模板類是肯定的。有些類可能不需要自動呼叫構造和析構,記憶體分配器就分出來了,就只負責分配物件的記憶體。方便起見,還是要有new和delete功能的對應方法,那就另外用乙個模板類包裝記憶體分配器,是外部使用的類,new函式取得物件記憶體後再呼叫建構函式,也要有malloc和free直接呼叫記憶體分配器的對應函式。

記憶體到底預分配多大?其實不好說,但是也是可**的,實際測試統計之後還是會找到乙個比較可靠的值。其實記憶體不必一次就分配那麼多,雖然最大峰值是max,大部分時間使用量都是遠小於max的。記憶體按組分配要好些,max分成多個組,先分配乙個組用到,不夠了用完的時候,再要乙個組,這樣子使用率要高些。組在完全沒有使用的情況下是可以被**的,是否要被**可以變動。這也不會降低好多效率,組的數量不會很多,而且應該更加記憶體使用的情況而定,乙個組裡面包含多少個物件也是可調節的,測試後會有乙個較好的值。

大概說哈結構嘛,記憶體分配器(allocator)有malloc和free,組(memorygroup)的單向鍊錶,也可以用雙向鍊錶我是為了節約些記憶體。通過模板引數把型別(t)、組數(groupsize)、物件數(objectsize)傳給組。

下面有簡易**說明:

1template

<

typename t,

intgs,

intos

>

2class

allocator3;

組是記憶體分配器的內部類,組才真正呼叫系統malloc分配整塊記憶體,按類數分給物件記憶體(memoryobject)陣列分別儲存位址。

1struct

memoryobject2;

6struct

memorygroup7;

組維護乙個空閒物件記憶體鍊錶也是單向鍊錶,當記憶體分配器需要位址的時候,組就把空閒鍊錶中的乙個物件記憶體返回,並把它從鍊錶中刪除。當記憶體分配器要釋放物件的時候,物件指標傳遞給組,組進行效驗是否由該組分配,如果是就簡單的找到對應物件記憶體,新增到空閒鍊錶。

外部使用的記憶體管理類包裝記憶體分配器,實現了malloc和free直接呼叫記憶體分配器的,還有new和delete函式是在取得位址後呼叫構造和呼叫析構後再傳遞指標。為了安全起見,用特例化把new和delete與malloc和free分離開,乙個例項化的模板類只能呼叫其中一對函式。 

1template

<

class

t,int

gs,int

cs,bool

nc,bool

ar>

2class

memorymanager3;

78template

<

class

t,int

gs,int

cs,bool

nc,bool

ar>

9class

memorymanager

<

t,gs,cs,

true

,ar>10;

模板引數的第4個引數(needconstruct)選擇使用哪一對函式,第5個引數(autorecycle)決定要不要在組完全未使用時**組。當然**組是可以動態改變的乙個選擇,所以第5個引數可以通過函式引數傳入。**組可以在記憶體分配器是否物件時檢測組的使用情況,為了跟蹤使用情況可以在組內部附加乙個計數器統計未使用物件數量,初始是設定的物件數,使用時減1**時加1,這個計數器在以後還可以計數使用率等,作為除錯和測試資訊輸出。

為了使用的安全起見,用巨集釋放物件指標同時把物件指標賦值為0,因為使用了記憶體管理器所以與一般的釋放巨集不同需要傳入記憶體管理。

1#define

free(m,p)     }

2#define

delete(m,p)     }

基本上就是這麼多啦,其實也不是黑複雜的東西。

後面講哈記憶體使用的不同情況,組數量和物件數量設定的一點想法。

FreeRTOS初探 記憶體管理

記憶體管理 概覽 背景 每當任務 佇列或是訊號量被建立時,核心需要進行動態記憶體分配。呼叫標準的malloc 和free 庫函式,必須承擔以下若干問題 解決方案 freertos將記憶體分配作為可移植層面。內容 記憶體分配方案範例 heap 1.c heap 1.c實現乙個非常基本的pvportma...

初探Linux核心中的記憶體管理

初探linux核心管理 核心本身不像使用者空間那樣奢侈的使用記憶體 核心是如何管理記憶體?什麼是記憶體管理單元 mmu 就是把虛擬位址轉換為實體地址的硬體 那什麼是虛擬位址呢?高階記憶體並不永久的對映到核心位址空間上,什麼是高階記憶體?核心用page資料結構來描述當前時刻在相關物理記憶體中存放的東西...

Irrlicht遊戲引擎 初探

irrlicht引擎在windows的安裝和使用 我是irrlicht引擎的初學者,在查閱了指導書和網路上的教程之後大概地了解了irrlicht在windows中的安裝。首先介紹一下irrlicht引擎。irrlicht是一款遊戲引擎,它非常輕量,要使用基於irrlicht引擎的遊戲只需要額外地新增...