大家可能会遇到一些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内存分配方式,掌握他们,就基本上能解决我们

Ogre内存池的使用和说明的更多相关文章

  1. 【转载】OGRE 内存管理

    原文:OGRE 内存管理 Ogre引擎中与内存管理相关的文件大致有以下几个(只列出头文件) OgreAlignedAllocator.h OgreMemoryAllocatedObject.h Ogr ...

  2. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  3. berkeley db 内存池分配机制

    __memp_alloc() 注: MPOOL_ALLOC_SEARCH_DYN 没有 出现在 bdb document上, 也没出现在 除了mp_alloc外的代码里. 先删了 以便代码清楚. 按 ...

  4. NGINX 内存池有感

    写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...

  5. 【uTenux实验】内存池管理(固定内存池和可变内存池)

    1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...

  6. boost的线程池和内存池 智能指针

    内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...

  7. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

  8. nginx源码学习----内存池

    最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.各种内存方面的问题悄然 ...

  9. nginx源码分析—内存池结构ngx_pool_t及内存管理

    Content 0. 序 1. 内存池结构 1.1 ngx_pool_t结构 1.2 其他相关结构 1.3 ngx_pool_t的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2 ...

随机推荐

  1. JavaScript Tutorial

    JavaScript Tutorial http://javascript.info/root Object.create rabit.hasOwnProperty('eats') Object.ge ...

  2. SQL对like 操作中的特殊字符处理方法

    SQL对like 操作中的特殊字符处理方法:    SQL Server查询过程中,单引号 ' 是特殊字符,所以在查询的时候要转换成双单引号 '' .    在like操作还有以下特殊字符:下划线_, ...

  3. Ligerui Grid组件--学生信息列表

    一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证码的实现(经常用,记录备用) 3.Ligerui首页的快速搭建 4.Ligerui Grid组件--学生信 ...

  4. 简单制作mib表

    今天放假后第一天上班,将假前自学制作mib表的东西说一下. 在这里呢,我以世界-中国-上海-闵行这种包含关系介绍,感觉更容易理解. MIB file的开始和结束 所有的MIB file的都以DEFIN ...

  5. html+css学习笔记 4[定位]

    如何让图1中的div2移动到如图2上的位置: 思路:哪些css命令能够影响盒子显示的位置呢? relative相对定位/定位偏移量 position:relative;  相对定位         a ...

  6. 3139:[HNOI2013]比赛 - BZOJ

    题目描述 Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联赛共N只队伍参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支 ...

  7. 详解HTML5中的<aside>元素与<article>元素

    <aside>元素HTML<aside>元素表示一个页面的一部分, 它的内容跟这个页面的其它内容的关联性不强,或者是没有关联,单独存在.<aside>元素通常显示成 ...

  8. 坑人的 try catch finally

    一直以为这样可以关闭 fs, 其实不行 static void Main(string[] args) { FileStream fs = null; try { fs = new FileStrea ...

  9. [C/CPP系列知识] 在C中使用没有声明的函数时将发生什么 What happens when a function is called before its declaration in C

    http://www.geeksforgeeks.org/g-fact-95/ 1 在C语言中,如果函数在声明之前被调用,那么编译器假设函数的返回值的类型为INT型, 所以下面的code将无法通过编译 ...

  10. linux vi修改后如何保存

    linux vi修改后如何保存 按ESC键去到命令模式,然后: :w?? 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi :w! 强制保存,不推出vi :wq 保存文件并 ...