首页 > 代码库 > Memory allocate in Ogre
Memory allocate in Ogre
Memory allocate in Oger
Memory allocate
Every memory in ogre will be allocated from AllocatedObject, it use Policy to switch from different allocators.
It looks like this:
template <class Alloc> class _OgreExport AllocatedObject { public: void* operator new(size_t sz, const char* file, int line, const char* func) { return Alloc::allocateBytes(sz, file, line, func); } void* operator new(size_t sz) { return Alloc::allocateBytes(sz); } /// placement operator new void* operator new(size_t sz, void* ptr) { (void) sz; return ptr; } /// array operator new, with debug line info void* operator new[] ( size_t sz, const char* file, int line, const char* func ) { return Alloc::allocateBytes(sz, file, line, func); } void* operator new[] ( size_t sz ) { return Alloc::allocateBytes(sz); } ..... ..override delete ..... }
Underlying memory allocation is done by policy.
There are 3 predefined memory allocator policies and 1 custom memory allocator in ogre.
#define OGRE_MEMORY_ALLOCATOR_STD 1#define OGRE_MEMORY_ALLOCATOR_NED 2
#define OGRE_MEMORY_ALLOCATOR_USER 3
#define OGRE_MEMORY_ALLOCATOR_NEDPOOLING 4
By default ogre use OGRE_MEMORY_ALLOCATOR_NEDPOOLING, STD is legacy,
If you are interested, you can read the ned allocation policy here.
For most user, you just need to know how to use it.
It use macro to choose policy, which looks like this
#elif OGRE_MEMORY_ALLOCATOR == OGRE_MEMORY_ALLOCATOR_NED # include "OgreMemoryNedAlloc.h" namespace Ogre { template <MemoryCategory Cat> class CategorisedAllocPolicy : public NedAllocPolicy{}; template <MemoryCategory Cat, size_t align = 0> class CategorisedAlignAllocPolicy : public NedAlignedAllocPolicy<align>{}; } #elifAs yo can see, the policy it self is a template, it takes a nontype argument MemoryCategory which is defined as
enum MemoryCategory { /// General purpose MEMCATEGORY_GENERAL = 0, /// Geometry held in main memory MEMCATEGORY_GEOMETRY = 1, /// Animation data like tracks, bone matrices MEMCATEGORY_ANIMATION = 2, /// Nodes, control data MEMCATEGORY_SCENE_CONTROL = 3, /// Scene object instances MEMCATEGORY_SCENE_OBJECTS = 4, /// Other resources MEMCATEGORY_RESOURCE = 5, /// Scripting MEMCATEGORY_SCRIPTING = 6, /// Rendersystem structures MEMCATEGORY_RENDERSYS = 7, // sentinel value, do not use MEMCATEGORY_COUNT = 8 };This is used to indicate the purse of a chunk of memory being used.These categories will be provided at allocation time in order to allow
the allocation policy to vary its behaviour if it wishes.
Then ogre define specific class allocator which looks like this:
typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_SCENE_OBJECTS> SceneObjAllocPolicy; typedef AllocatedObject<SceneObjAllocPolicy> SceneObjAllocatedObject; typedef SceneObjAllocatedObject MovableAlloc;
class MovableObject : <span style="font-family: Arial, Helvetica, sans-serif;">MovableAlloc</span>Then you can use OGRE_NEW to allocate memory.
For primitive type you can use OGRE_NEW_T, It‘s defined as
OGRE_NEW_T(T, category) new (::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T))) TJust a placement new.
Memory allocate in Ogre
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。