大家可能会遇到一些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. Inject js code to exchange 2013

    1. save the following code to C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\owa ...

  2. C# Windows - 创建控件

    VS提供了一个项目类型Windows Control Library,使用它可以创建自己的控件. 可以开发两种不同类型的自定义控件: 用户或组合控件:这种控件是根据现有控件的功能创建一个新控件.这类控 ...

  3. linux 错误总结

    帝国cms登录后台提示“登录成功”,接着又提示“您还未登录” 把帝国cms文件夹下的/e/data/adminlogin 目录权限不可写导致,请将此目录权限设置为777权限即可解决.就可以正常登录后台 ...

  4. 【转】jquery-取消冒泡

    转自:http://blog.163.com/css_mm/blog/static/209182176201262665157634/ 1.通过返回false来取消默认的行为并阻止事件起泡. jQue ...

  5. Django 学习笔记之六 建立一个简单的博客应用程序

    最近在学习django时建立了一个简单的博客应用程序,现在把简单的步骤说一下.本人的用的版本是python 2.7.3和django 1.10.3,Windows10系统 1.首先通过命令建立项目和a ...

  6. BZOJ 1143: [CTSC2008]祭祀river 最大独立集

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题解: 给你一个DAG,求最大的顶点集,使得任意两个顶点之间不可达. 把每个顶点v ...

  7. H5下拉刷新特效demo,动画流畅

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  8. 【POJ】【2975】Nim

    博弈论 我哭……思路错误WA了6次?(好像还有手抖点错……) 本题是要求Nim游戏的第一步必胜策略有几种. 一开始我想:先全部异或起来得到ans,从每个比ans大的堆里取走ans个即可,答案如此累计… ...

  9. isEmpty()与equals()、==“”区别

    isEmpty方法源码:public static boolean isEmpty(String str) { return (str == null) || (str.length() == 0); ...

  10. 关闭VS时, 每次都 会弹出 保存以下各项的更改吗?

    如果是添加项目, 或修改了解决方案的配置, 会弹出这个是正常的.  如果在没有修改的情况下还这样就是有问题的.   原因:  在Vs中安装了PowerDesigner插件, 并在VS中点了该插件的东西 ...