《Game Engine Architecture》学习笔记-----内存管理1
内存管理
内存使用效率和两个东西有关:
1,同过new,malloc操作进行动态内存分配很慢,尽量避免,可以通过使用传统内存分配来减少分配开销。
2,CPU处理连续的内存区域比处理离散的内存区域要快。所以为了提高效率,要对内存碎片进行处理。
通过这两条路线来优化内存管理代码。
1.优化动态内存分配
通过malloc()和new()等进行动态内存分配是基于堆的。典型的非常慢。
因为:
1)堆是一个通用存储区域,它被控制来可以分配任何大小的内存,使得malloc,new等函数需要更多的上层管理。导致了缓慢。
2)使用malloc,new等函数时系统首先会进行环境切换,切换到核心模式处理内存分配申请,然后又切换会程序,这样的环境切换也增加了开销。
下面是一条约定俗成的游戏开发内存分配规则:
keep heap allocation to a minimun,and never allocate from the heap within a tight loop.
尽量少的使用malloc和new 等基于堆的动态分配,更不要在一个紧密的循环里面使用。
当然,没有任何游戏引擎避开了动态内存分配,所以绝大部分的游戏引擎都有自己的一个或者多个内存分配器。一个自己的内存分配器在刚刚提到那两点上有比操作系统更好的Heap分配器性能。第一,一个自己的内存分配器可以安全的访问一块被分配好的内存(她自己通过malloc()或者new或者已经声明的全局变量)。这样可以允许这些访问在user mode下以及避免了开销昂贵的操作系统上下文切换。第二,对于各种内存使用模式处理上,一个自定义的内存分配器也比一个通用的Heap内存分配器更有效率。
有几种形式的传统分配器:
1)基于栈的分配器,双向栈。
2)内存池(通常用于同样尺寸的多段内存)
3)线性分配器
4)单帧,双帧内存分配器(用于只在一帧或者两帧中使用的临时数据,每一帧的开始时需要clear)