大家可能會遇到一些Ogre中的記憶體分配的方面問題,我對這個總結了一下記憶體分配的方面資料。
Ogre在1.7版本後,統一了記憶體分配策略,提供了記憶體是否洩漏的跟蹤和記憶體池等比較方便開發的一些策略,目前提供了四種記憶體分配
OGRE_MEMORY_ALLOCATOR 方式:
#define OGRE_MEMORY_ALLOCATOR_STD 1
#define OGRE_MEMORY_ALLOCATOR_NED 2
#define OGRE_MEMORY_ALLOCATOR_USER 3
#define OGRE_MEMORY_ALLOCATOR_NEDPOOLING 4
大家從字面意思上應該能知道這四種記憶體分配方是的1、標準記憶體分配(主要是使用系統提供的預設記憶體分配方法);2、Ned方式記憶體分配;3、使用者自定義的記憶體分配方法(主要是針對stl容器);4、Ned記憶體池分配方法。
NedPooling的實現在Ogre原始碼中可以找到,如果你們感興趣可以去研究一下記憶體分配方法。
不管是用哪種分配模式,如果開啟了OGRE_MEMORY_TRACKER_DEBUG_MODE /OGRE_MEMORY_TRACKER_RELEASE_MODE ,那麼都可以對記憶體洩漏進行跟蹤,系統有無記憶體洩漏,洩漏了多少記憶體,如果我們在debug模式下編譯執行,有些可以跟蹤到哪行程式碼會發生記憶體洩漏。
下面我給出一個示例,具體說明一下各種情況下的記憶體分配怎麼用:
1、stl標準模板庫中的容器,不要直接使用std::map,std::vector,std::list,std::queue等容器;改用 Ogre::map::type,Ogre::vector::type,Ogre::list::type等容器。使用後面的容器將會採用編譯時指定的記憶體分配方式做記憶體分配,主要的優點是可以對容器中的記憶體是否洩漏進行跟蹤。
eg:
Ogre::vector<Ogre::MeshPtr>::type meshList;
最好不要使用std::vector,因為直接使用std::vector不具有記憶體跟蹤功能。
根據Ogre的程式設計風格,建議按照如下方式宣告變數:
typedef Ogre::vector<Ogre::MeshPtr>::type MeshList;
typedef MeshList::iterator MeshListIterator;
MeshList mMeshList;
2、如果你的物件需要記憶體跟蹤和採用Ogre的記憶體分配方式,那麼你的類需要繼承自Ogre::GeometryAllocatedObject ,如果你的物件是頻繁的記憶體申請釋放建議你最好繼承這個類。
1.7.2以後繼承於AllocatedObject
eg:
class MyObject: public Ogre::GeometryAllocatedObject
{
.......
}
MyObject* myObject=OGRE_NEW MyObject();
OGRE_DELETE myObject;
myObject=0;
當然直接使用new,delete也可以,因為GeometryAllocatedObject這個基類過載了new,delete操作符,使用OGRE_NEW,OGRE_DELETE只是為了方便開發人員指導這個類是採用了記憶體池的方式。
3、如果你的物件沒有繼承自Ogre::GeometryAllocatedObject ,但是你又像使用Ogre提供的記憶體池和記憶體洩漏跟蹤功能,那麼你可以採用如下的方式:
eg:
class MyObject
{...}
MyObject* myObject=OGRE_NEW_T(MyObject,Ogre::MEMCATEGORY_GENERAL)();
OGRE_DELETE_T(myObject,Ogre::MEMCATEGORY_GENERAL);
myObject=0;
4、對於一些簡單型別的變數,如果要使用Ogre提供的記憶體池和記憶體跟蹤,分配記憶體塊通常用的是
eg:
size_t count=1000;
char* chunk=OGRE_ALLOC_T(char,count,Ogre::MEMCATEGORY_GENERAL);
OGRE_FREE(chunk,Ogre::MEMCATEGORY_GENERAL);
chunk=0;
以上就是我們常用的Ogre記憶體分配方式,掌握他們,就基本上能解決我們