这篇文章将介绍堆栈分配器,以及堆栈分配器的两种特殊使用场景——单帧和双缓冲内存分配器。

基于堆栈的分配器(stack allocator)

  这种分配器和C++本身的堆栈分配使用相同逻辑。就不多赘述。

  一种特殊的进化版本:双端堆栈分配器(double-ended stack allocator):一块内存给两个堆栈分配器使用,一个从底端向上分配,一个从顶端向下分配。

  在Midway的《Hydro Thunder》游戏里,采用这种方法。底堆栈用来载入及卸下游戏关卡(跑道);而顶堆栈则用来分配临时内存块,这些临时内存会在每帧中分配释放。这种方法保证游戏不出现内存碎片问题。

单帧分配器(single-frame allocator)

  单帧分配器就是使用上面提到的基于堆栈的分配器,在每帧开始时,都把堆栈的顶端指针重置到内存块的底端地址。在该帧中,在栈上分配内存。不断重复该过程。

  单帧分配的的益处是,分配了的内存永不手动释放,每帧开始时自动释放。但是,程序员必须有不错的自制能力。需要意识到,从单帧分配器分配的内存不能夸帧使用。

双缓冲分配器(double-buffered allocator)

  双缓冲分配器容许在第i帧分配的内存块用于第(i+1)帧。实现方法就是建立两个相同尺寸的单帧堆栈分配器,并在每帧交替使用。

基于堆栈的分配器实现比较简单,不再赘述。