大家可能会遇到一些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. windows环境下MySQL重启的命令行说明

    ctrl+r 弹出运行框,输入cmd,然后再控制太输入命令: 1.点击“开始”->“运行”(快捷键Win+R). 2.停止:输入 net stop mysql 3.启动:输入 net start ...

  2. android开发 socket接收图片并保存

    逻辑:接收到socket之后需要将socket发送的图片数据保存下来并通知handler更新界面 关键代码: public void readImage(Socket socket) { try { ...

  3. [Android] ImageView.ScaleType设置图解 【转载】

    ImageView的Scaletype决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等. 设置的方式包括: 1. 在layout xml中定义android:s ...

  4. 【笔记】UML核心元素

    1.参与者 定义:在系统之外与系统交互的某人或某物. 特点:1.可以非人:2.与系统直接交互:3.主动发出动作并获得反馈:4.涉众(stakerholder)的代表 具有两个版型: 1.业务主角(bu ...

  5. IP地址格式控制

    /// <summary> /// 验证IP格式是否输入正确 /// </summary> /// <param name="ip"></ ...

  6. cg 到hlsl的转换

    http://msdn.microsoft.com/en-us/library/windows/desktop/ff471376(v=vs.85).aspx http://gamedev.stacke ...

  7. memcached+php客户端

    连接memcached <?php $mem = new Memcache; $mem->connect('localhost',11211) or die("connected ...

  8. CSS属性--过渡(transtion)

    首先介绍一下transition的属性取值: transition-property : 主要设置对象中的参与过渡的属性,包括(border-color,background-color,color) ...

  9. PAT-乙级-1047. 编程团体赛(20)

    1047. 编程团体赛(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 编程团体赛的规则为:每个参赛队由若 ...

  10. centos6.5\win7双系统安装配置

    一.安装所需软件 1.分区助手专业版PACNPro.exe(必需):用来对硬盘分区,将磁盘的一部分格式化成Linux可以识别的ext3格式 2.Ext2Fsd(硬盘安装必需,光盘安装不用):因为Win ...