当前位置: 代码迷 >> 综合 >> Box2D v2.3.0 用户指南(第三章)
  详细解决方案

Box2D v2.3.0 用户指南(第三章)

热度:17   发布时间:2023-12-14 22:10:20.0
??

第三章 公共模块(Common)

3.1简介

公共模块包含设置(settings),内存管理(memorymanagement),矢量计算(vector math)。

 

3.2设置

头文件b2Settings.h包含:

·  诸如int32,float32这类数据类型

·  常量(constants)

·  分配的封装(allocation wrapper)

·  版本号

 

类型(types)

Box2D定义了多种数据类型,例如float32,int8等等,以方便我们定义不同大小的结构。

 

常量

Box2D定义了很多常量,这些常量在b2Settings.h中做了说明。通常我们不需要去修改这些常量。

 

分配的封装

设置(settings)的文件定义b2Alloc和b2Free,用于大块内存分配,你可以将这些调用转移到你自己的内存管理系统中。

 

版本

b2Version结构保存当前的版本信息,你可以在运行时调取。

 

3.3内存管理

Box2D的设计理念中,很多设计决策都是为了快速高效的使用内存。这一节我们会讨论Box2D怎样和为什么要分配内存。

Box2D倾向于分配大量的小物体(范围大约在50-300字节)。使用malloc和new方法在堆(heap)空间上分配内存对于小物体来说效率很低,并且容易产生内存碎片(fragmentation)。这些小物体的生命周期大多很短,例如接触(contact),可能仅仅持续几个时间片段。因此我们需要一个分配器(allocator),能够高效的为这些物体分配堆空间。

Box2D的解决方法是使用一个叫做b2BlockAllocator的小物体分配器(smallobject allocator,SOA),SOA负责维护一定数量的大小可变的可增长的内存池(pool),当遇到内存请求时,SOA返回一块儿大小最合适的内存块,当一个内存块被释放的时候,它实际上被内存池回收了。这些操作保证了快速响应内存的分配和释放,不会产生大量的堆请求。

由于使用了SOA,在Box2D中你不必再去new或者malloc一个物体、装置或者关节对象了,有一个例外,你需要自己动手分配一个b2World对象,b2World类中提供了工厂方法用于创建物体,装置和关节,以便Box2D通过SOA将枯燥的处理细节包装起来。因此,我们永远也不要对物体,装置或者关节手动调用delete或者free来释他们。

在执行一个时间间隔(timestep)时,Box2D需要一些临时内存空间,这部分空间它通过一个栈分配器(b2StackAllocator)来避免单步(per-step)堆空间分配,你不需要跟栈分配器打交道,但是知道它的存在还是有必要的。

 

3.4数学(math)

Box2D包含了一个小的向量和矩阵模块,为了满足Box2D以及API内部调用的需求。所有的成员都提供了调用接口,所以你也能够在你的工程中调用他们。

数学库代码非常简洁以便于移植和维护。


??