Oh!Coder

Coding Life

第三章 公共模块

| Comments

声明:此文章翻译自Box2D v2.2.0用户手册,仅供学习参考。

3.1 关于

公共模块包括了设置,内存管理以及矢量数学。

3.2 设置

b2Settings.h头文件包括如下:

  • 诸如int32和float32的类型
  • 常量
  • 分配器包装(Allocation wrappers)
  • 版本号

类型

Box2D定义了大量诸如float32,int8类型等等。可以方便的确定结构的大小。

常量

Box2D定义了一些常量。这些都被记录在b2Settings.h文件中。正常情况下不需要调整这些常量。

Box2D使用浮点数来进行模式和碰撞计算。由于舍入方面误差的原因需要定义一些公差。其中一些公差是绝对的,一些公差是相对的。绝对的公差使用MKS(Meters-Kilometers-Seconds)单位。

分配器包装(Allocation wrappers)

设置文件中定义了b2Alloc和b2Free两个方法,用于大的内存分配。你可以使用这两个方法来调用你的内存管理系统。

版本号

在程序运行的时候你可以通过查询b2Version这个结构体来获取当前的版本号。

3.3 内存管理

Box2D的大量设计都是为了能够快速和有效的使用内存。在本节,我将讨论怎样以及为什么要Box2D来分配内存。

Box2D更倾向于分配大量的小对象(约50~300字节)。若使用malloc或者new在内存堆上分配将是低效的,并且会产生内存碎片。大量小对象或许会有很短的生命周期,例如接触(contacts),不过可以持续几个时间步长。所以我们需要一个分配器来有效的为这些对象提供堆内存。

Box2D的解决方案是使用一个叫做b2BlockAllocator的小对象分配器(small object allocator,SOA)。小对象分配器持有一个可任意增长大小不定的内存池。当需要内存的时候,SOA根据需求返回一块大小合适的内存空间。当内存块释放之后,再返还给内存池。这两个操作很快,只会引起很小的堆流量。

既然Box2D使用SOA,那么你就永远不要使用new和malloc创建物体,定制器(fixture)或者连接器。无论如何,你仍然需要创建一个属于你自己的b2World对象。b2World类提供了创建物体,定制器(fixture)以及连接器的工厂方法。那么这样Box2D就可以使用SOA并且可以为你隐藏血腥(译者注:这里指对内存的分配和回收,也显示了作者很幽默)的细节。永远不要调用delete或者是free来释放物体,定制器(fixture)或者连接器。

当运行一个步长的时候,Box2D需要临时内存空间。为了完成这个任务,Box2D会调用一个叫做b2StackAllocator的栈分配器来防止单步堆分配。你不需要关心栈分配器,但是了解一下还是不错的。

3.4 数学

Box2D包含了一个简单的小巧的向量和矩阵模块。这部分设计用来满足Box2D内部使用和API接口的需要。这部分所有成员都是公开的,所以你可以在你的应用程序中自由的使用。

数学库尽量保持着简单,保持着Box2D的可移植性和可维护性。

Comments